diff options
author | hashimoto@chromium.org <hashimoto@chromium.org> | 2015-02-03 03:17:30 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org> | 2015-02-03 03:17:30 +0000 |
commit | 9f00bce09a6a3ce4da0673376da2596cb787e3c8 (patch) | |
tree | c58898cbb920a3b543f36975d2d99ad945ee1343 | |
parent | Handle failures of copying process data from a core file. (diff) | |
download | breakpad-9f00bce09a6a3ce4da0673376da2596cb787e3c8.tar.xz |
Demangle symbol name
The spec says it should be demangled.
https://code.google.com/p/google-breakpad/wiki/SymbolFiles
BUG=chromium:453498
R=mark@chromium.org
Review URL: https://breakpad.appspot.com/2854002
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1421 4c0a9323-5329-0410-9bdc-e9ce6186880e
-rw-r--r-- | src/common/dwarf_cu_to_module.cc | 2 | ||||
-rw-r--r-- | src/common/linux/elf_symbols_to_module.cc | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/common/dwarf_cu_to_module.cc b/src/common/dwarf_cu_to_module.cc index aaac058b..1729d4ac 100644 --- a/src/common/dwarf_cu_to_module.cc +++ b/src/common/dwarf_cu_to_module.cc @@ -352,7 +352,7 @@ void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( case dwarf2reader::DW_AT_MIPS_linkage_name: { char* demangled = NULL; int status = -1; -#if !defined(__ANDROID__) +#if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. demangled = abi::__cxa_demangle(data.c_str(), NULL, NULL, &status); #endif if (status != 0) { diff --git a/src/common/linux/elf_symbols_to_module.cc b/src/common/linux/elf_symbols_to_module.cc index 96c64fb6..562875e1 100644 --- a/src/common/linux/elf_symbols_to_module.cc +++ b/src/common/linux/elf_symbols_to_module.cc @@ -32,6 +32,7 @@ #include "common/linux/elf_symbols_to_module.h" +#include <cxxabi.h> #include <elf.h> #include <string.h> @@ -157,6 +158,16 @@ bool ELFSymbolsToModule(const uint8_t *symtab_section, iterator->shndx != SHN_UNDEF) { Module::Extern *ext = new Module::Extern(iterator->value); ext->name = SymbolString(iterator->name_offset, strings); +#if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. + int status = 0; + char* demangled = + abi::__cxa_demangle(ext->name.c_str(), NULL, NULL, &status); + if (demangled) { + if (status == 0) + ext->name = demangled; + free(demangled); + } +#endif module->AddExtern(ext); } ++iterator; |