Mac dump_syms: Fix -a on arm64

- Resets `selected_object_file_` when a new file is read. This was a dangling pointer previously.
- When `-a` is provided, ensures that both parts of a split module use
the given architecture.

Bug: None
Change-Id: I581d41b0eee4ec2b0d598fb80b9065e7ebde0e0d
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/3788222
Reviewed-by: Mark Mentovai <mark@chromium.org>
This commit is contained in:
Leonard Grey 2022-07-26 14:23:54 -04:00 committed by Mark Mentovai
parent afc8daa2de
commit 86ea554601
2 changed files with 37 additions and 25 deletions

View File

@ -121,6 +121,7 @@ vector<string> list_directory(const string& directory) {
namespace google_breakpad { namespace google_breakpad {
bool DumpSymbols::Read(const string& filename) { bool DumpSymbols::Read(const string& filename) {
selected_object_file_ = nullptr;
struct stat st; struct stat st;
if (stat(filename.c_str(), &st) == -1) { if (stat(filename.c_str(), &st) == -1) {
fprintf(stderr, "Could not access object file %s: %s\n", fprintf(stderr, "Could not access object file %s: %s\n",

View File

@ -107,6 +107,35 @@ static void CopyCFIDataBetweenModules(Module* to_module,
} }
} }
static bool SetArchitecture(DumpSymbols& dump_symbols,
const NXArchInfo* arch,
const std::string& filename) {
if (!dump_symbols.SetArchitecture(arch->cputype, arch->cpusubtype)) {
fprintf(stderr, "%s: no architecture '%s' is present in file.\n",
filename.c_str(), arch->name);
size_t available_size;
const SuperFatArch* available =
dump_symbols.AvailableArchitectures(&available_size);
if (available_size == 1)
fprintf(stderr, "the file's architecture is: ");
else
fprintf(stderr, "architectures present in the file are:\n");
for (size_t i = 0; i < available_size; i++) {
const SuperFatArch* arch = &available[i];
const NXArchInfo* arch_info =
google_breakpad::BreakpadGetArchInfoFromCpuType(arch->cputype,
arch->cpusubtype);
if (arch_info)
fprintf(stderr, "%s (%s)\n", arch_info->name, arch_info->description);
else
fprintf(stderr, "unrecognized cpu type 0x%x, subtype 0x%x\n",
arch->cputype, arch->cpusubtype);
}
return false;
}
return true;
}
static bool Start(const Options& options) { static bool Start(const Options& options) {
SymbolData symbol_data = SymbolData symbol_data =
(options.handle_inlines ? INLINES : NO_DATA) | (options.handle_inlines ? INLINES : NO_DATA) |
@ -129,31 +158,9 @@ static bool Start(const Options& options) {
if (!dump_symbols.Read(primary_file)) if (!dump_symbols.Read(primary_file))
return false; return false;
if (options.arch) { if (options.arch &&
if (!dump_symbols.SetArchitecture(options.arch->cputype, !SetArchitecture(dump_symbols, options.arch, primary_file)) {
options.arch->cpusubtype)) { return false;
fprintf(stderr, "%s: no architecture '%s' is present in file.\n",
primary_file.c_str(), options.arch->name);
size_t available_size;
const SuperFatArch *available =
dump_symbols.AvailableArchitectures(&available_size);
if (available_size == 1)
fprintf(stderr, "the file's architecture is: ");
else
fprintf(stderr, "architectures present in the file are:\n");
for (size_t i = 0; i < available_size; i++) {
const SuperFatArch *arch = &available[i];
const NXArchInfo *arch_info =
google_breakpad::BreakpadGetArchInfoFromCpuType(
arch->cputype, arch->cpusubtype);
if (arch_info)
fprintf(stderr, "%s (%s)\n", arch_info->name, arch_info->description);
else
fprintf(stderr, "unrecognized cpu type 0x%x, subtype 0x%x\n",
arch->cputype, arch->cpusubtype);
}
return false;
}
} }
if (options.header_only) if (options.header_only)
@ -171,6 +178,10 @@ static bool Start(const Options& options) {
if (!dump_symbols.Read(options.srcPath)) if (!dump_symbols.Read(options.srcPath))
return false; return false;
if (options.arch &&
!SetArchitecture(dump_symbols, options.arch, options.srcPath)) {
return false;
}
Module* cfi_module = NULL; Module* cfi_module = NULL;
if (!dump_symbols.ReadSymbolData(&cfi_module)) if (!dump_symbols.ReadSymbolData(&cfi_module))
return false; return false;