diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-19 12:01:18 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-19 12:01:18 +0000 |
commit | c0de12404986565d2a7b66569af5e09ec604ffd9 (patch) | |
tree | 007c6a23022007f52326b10a4843846b59800a00 /src/tools/linux/dump_syms/dump_syms.cc | |
parent | 05728773737deb58a10cdbe29750152c13e400bf (diff) | |
parent | 5c069a8915093a3af6bb26639a4ac8aa0db2badb (diff) | |
download | google-breakpad-c0de12404986565d2a7b66569af5e09ec604ffd9.tar.gz |
Snap for 7474514 from 5c069a8915093a3af6bb26639a4ac8aa0db2badb to mainline-media-releaseandroid-mainline-12.0.0_r89android-mainline-12.0.0_r74android-mainline-12.0.0_r62android-mainline-12.0.0_r46android-mainline-12.0.0_r29android-mainline-12.0.0_r12android-mainline-12.0.0_r119android-mainline-12.0.0_r104android12-mainline-media-release
Change-Id: Ib9813bef7c81bcd39b9788281fa7219d68f5891a
Diffstat (limited to 'src/tools/linux/dump_syms/dump_syms.cc')
-rw-r--r-- | src/tools/linux/dump_syms/dump_syms.cc | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/src/tools/linux/dump_syms/dump_syms.cc b/src/tools/linux/dump_syms/dump_syms.cc index 11617883..ebdf2314 100644 --- a/src/tools/linux/dump_syms/dump_syms.cc +++ b/src/tools/linux/dump_syms/dump_syms.cc @@ -27,6 +27,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#include <paths.h> #include <stdio.h> #include <unistd.h> @@ -38,47 +39,73 @@ #include "common/linux/dump_symbols.h" using google_breakpad::WriteSymbolFile; +using google_breakpad::WriteSymbolFileHeader; int usage(const char* self) { fprintf(stderr, "Usage: %s [OPTION] <binary-with-debugging-info> " "[directories-for-debug-file]\n\n", self); fprintf(stderr, "Options:\n"); - fprintf(stderr, " -c Do not generate CFI section\n"); - fprintf(stderr, " -r Do not handle inter-compilation unit references\n"); - fprintf(stderr, " -v Verbose logging. Print all warnings to stderr\n"); + fprintf(stderr, " -i: Output module header information only.\n"); + fprintf(stderr, " -c Do not generate CFI section\n"); + fprintf(stderr, " -r Do not handle inter-compilation " + "unit references\n"); + fprintf(stderr, " -v Print all warnings to stderr\n"); + fprintf(stderr, " -n <name> Use specified name for name of the object\n"); + fprintf(stderr, " -o <os> Use specified name for the " + "operating system\n"); return 1; } int main(int argc, char **argv) { if (argc < 2) return usage(argv[0]); - + bool header_only = false; bool cfi = true; bool handle_inter_cu_refs = true; bool log_to_stderr = false; + std::string obj_name; + const char* obj_os = "Linux"; int arg_index = 1; while (arg_index < argc && strlen(argv[arg_index]) > 0 && argv[arg_index][0] == '-') { - if (strcmp("-c", argv[arg_index]) == 0) { + if (strcmp("-i", argv[arg_index]) == 0) { + header_only = true; + } else if (strcmp("-c", argv[arg_index]) == 0) { cfi = false; } else if (strcmp("-r", argv[arg_index]) == 0) { handle_inter_cu_refs = false; } else if (strcmp("-v", argv[arg_index]) == 0) { log_to_stderr = true; + } else if (strcmp("-n", argv[arg_index]) == 0) { + if (arg_index + 1 >= argc) { + fprintf(stderr, "Missing argument to -n\n"); + return usage(argv[0]); + } + obj_name = argv[arg_index + 1]; + ++arg_index; + } else if (strcmp("-o", argv[arg_index]) == 0) { + if (arg_index + 1 >= argc) { + fprintf(stderr, "Missing argument to -o\n"); + return usage(argv[0]); + } + obj_os = argv[arg_index + 1]; + ++arg_index; } else { + printf("2.4 %s\n", argv[arg_index]); return usage(argv[0]); } ++arg_index; } if (arg_index == argc) return usage(argv[0]); - // Save stderr so it can be used below. - FILE* saved_stderr = fdopen(dup(STDERR_FILENO), "w"); + FILE* saved_stderr = fdopen(dup(fileno(stderr)), "w"); if (!log_to_stderr) { - freopen("/dev/null", "w", stderr); + if (freopen(_PATH_DEVNULL, "w", stderr)) { + // If it fails, not a lot we can (or should) do. + // Add this brace section to silence gcc warnings. + } } - const char* binary; std::vector<string> debug_dirs; binary = argv[arg_index]; @@ -88,11 +115,22 @@ int main(int argc, char **argv) { debug_dirs.push_back(argv[debug_dir_index]); } - SymbolData symbol_data = cfi ? ALL_SYMBOL_DATA : NO_CFI; - google_breakpad::DumpOptions options(symbol_data, handle_inter_cu_refs); - if (!WriteSymbolFile(binary, debug_dirs, options, std::cout)) { - fprintf(saved_stderr, "Failed to write symbol file.\n"); - return 1; + if (obj_name.empty()) + obj_name = binary; + + if (header_only) { + if (!WriteSymbolFileHeader(binary, obj_name, obj_os, std::cout)) { + fprintf(saved_stderr, "Failed to process file.\n"); + return 1; + } + } else { + SymbolData symbol_data = cfi ? ALL_SYMBOL_DATA : NO_CFI; + google_breakpad::DumpOptions options(symbol_data, handle_inter_cu_refs); + if (!WriteSymbolFile(binary, obj_name, obj_os, debug_dirs, options, + std::cout)) { + fprintf(saved_stderr, "Failed to write symbol file.\n"); + return 1; + } } return 0; |