aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhashimoto@chromium.org <hashimoto@chromium.org>2015-02-03 03:17:30 +0000
committerhashimoto@chromium.org <hashimoto@chromium.org>2015-02-03 03:17:30 +0000
commit9f00bce09a6a3ce4da0673376da2596cb787e3c8 (patch)
treec58898cbb920a3b543f36975d2d99ad945ee1343
parentHandle failures of copying process data from a core file. (diff)
downloadbreakpad-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.cc2
-rw-r--r--src/common/linux/elf_symbols_to_module.cc11
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;