diff options
author | Elliott Hughes <enh@google.com> | 2012-06-12 17:44:15 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2012-06-13 15:27:51 -0700 |
commit | 95aff770aad557685411775994bf2ec6bb370367 (patch) | |
tree | 360add38920eb519830b86859d53cc7afba79c76 /src/utils.cc | |
parent | a168c83a1d247094e9efb1244b0f73a5f1e1ed97 (diff) | |
download | art-95aff770aad557685411775994bf2ec6bb370367.tar.gz art-95aff770aad557685411775994bf2ec6bb370367.tar.bz2 art-95aff770aad557685411775994bf2ec6bb370367.zip |
Fix ridiculous pc offsets for static symbols in .so files.
Example before:
static art::HandleUnexpectedSignal(int, siginfo*, void*)+4146013245 [0xf75f6fcd] (libartd.so)
...and after:
static art::HandleUnexpectedSignal(int, siginfo*, void*)+1085 [0xf7e9872d] (libartd.so)
(This matches what gdb's x/1i said.)
Change-Id: I0f1ce29ad09bbe6f1f27aa8ef654e7fab2f2378e
Diffstat (limited to 'src/utils.cc')
-rw-r--r-- | src/utils.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/utils.cc b/src/utils.cc index d45568e5f..5fe540357 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -940,10 +940,12 @@ static void FindSymbolInElf(const backtrace_frame_t* frame, const backtrace_symb symbol_table = load_symbol_table(symbol->map_name); } const symbol_t* elf_symbol = NULL; + bool was_relative = true; if (symbol_table != NULL) { elf_symbol = find_symbol(symbol_table, symbol->relative_pc); if (elf_symbol == NULL) { elf_symbol = find_symbol(symbol_table, frame->absolute_pc); + was_relative = false; } } if (elf_symbol != NULL) { @@ -953,7 +955,9 @@ static void FindSymbolInElf(const backtrace_frame_t* frame, const backtrace_symb } else { symbol_name = elf_symbol->name; } - pc_offset = frame->absolute_pc - elf_symbol->start; + + // TODO: is it a libcorkscrew bug that we have to do this? + pc_offset = (was_relative ? symbol->relative_pc : frame->absolute_pc) - elf_symbol->start; } else { symbol_name = "???"; } |