summaryrefslogtreecommitdiffstats
path: root/src/utils.cc
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-06-12 17:44:15 -0700
committerElliott Hughes <enh@google.com>2012-06-13 15:27:51 -0700
commit95aff770aad557685411775994bf2ec6bb370367 (patch)
tree360add38920eb519830b86859d53cc7afba79c76 /src/utils.cc
parenta168c83a1d247094e9efb1244b0f73a5f1e1ed97 (diff)
downloadart-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.cc6
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 = "???";
}