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
diff --git a/src/utils.cc b/src/utils.cc
index d45568e..5fe5403 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -940,10 +940,12 @@
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 @@
} 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 = "???";
}