diff options
author | Christopher Ferris <cferris@google.com> | 2015-05-01 15:02:03 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2015-05-01 17:09:49 -0700 |
commit | cb66e8b29869b029debdb9f310bd3f5932848294 (patch) | |
tree | fa7f454151ee8040dc8938f26cc532ac3a9a6af2 /libbacktrace | |
parent | 2c8191d15f4ca0cbcff902959bb6bb67251c35f7 (diff) | |
download | unwinding-cb66e8b29869b029debdb9f310bd3f5932848294.tar.gz |
Add load base to map for relocation packing.
The new linker relocation packing support uses non-zero load bases,
so we better handle them properly.
Also print out the load base for a map if it's non-zero.
Bug: 20687795
(cherry picked from commit 82188a0bcce9d31d91f018790c4851b6fdd4768a)
Change-Id: Ibc37d8c8bb032820dca4e7531184349ba6d402d2
Diffstat (limited to 'libbacktrace')
-rw-r--r-- | libbacktrace/Backtrace.cpp | 7 | ||||
-rw-r--r-- | libbacktrace/UnwindMap.cpp | 2 | ||||
-rw-r--r-- | libbacktrace/backtrace_test.cpp | 11 |
3 files changed, 14 insertions, 6 deletions
diff --git a/libbacktrace/Backtrace.cpp b/libbacktrace/Backtrace.cpp index b2d8297..4e4003e 100644 --- a/libbacktrace/Backtrace.cpp +++ b/libbacktrace/Backtrace.cpp @@ -99,12 +99,7 @@ std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) { map_name = "<unknown>"; } - uintptr_t relative_pc; - if (BacktraceMap::IsValid(frame->map)) { - relative_pc = frame->pc - frame->map.start; - } else { - relative_pc = frame->pc; - } + uintptr_t relative_pc = BacktraceMap::GetRelativePc(frame->map, frame->pc); std::string line(StringPrintf("#%02zu pc %" PRIPTR " %s", frame->num, relative_pc, map_name)); if (!frame->func_name.empty()) { diff --git a/libbacktrace/UnwindMap.cpp b/libbacktrace/UnwindMap.cpp index fa59d07..4a4e2f3 100644 --- a/libbacktrace/UnwindMap.cpp +++ b/libbacktrace/UnwindMap.cpp @@ -51,6 +51,7 @@ bool UnwindMap::GenerateMap() { map.start = unw_map.start; map.end = unw_map.end; + map.load_base = unw_map.load_base; map.flags = unw_map.flags; map.name = unw_map.path; @@ -91,6 +92,7 @@ bool UnwindMapLocal::GenerateMap() { map.start = unw_map.start; map.end = unw_map.end; + map.load_base = unw_map.load_base; map.flags = unw_map.flags; map.name = unw_map.path; diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp index 36c73c5..28d146a 100644 --- a/libbacktrace/backtrace_test.cpp +++ b/libbacktrace/backtrace_test.cpp @@ -772,6 +772,7 @@ TEST(libbacktrace, format_test) { // Check map name empty, but exists. frame.map.start = 1; frame.map.end = 1; + frame.map.load_base = 0; #if defined(__LP64__) EXPECT_EQ("#01 pc 0000000000000001 <unknown>", #else @@ -809,6 +810,16 @@ TEST(libbacktrace, format_test) { EXPECT_EQ("#01 pc 12345678 MapFake (ProcFake+645)", #endif backtrace->FormatFrameData(&frame)); + + // Check func_name is set, func offset is non-zero, and load_base is non-zero. + frame.func_offset = 645; + frame.map.load_base = 100; +#if defined(__LP64__) + EXPECT_EQ("#01 pc 00000000123456dc MapFake (ProcFake+645)", +#else + EXPECT_EQ("#01 pc 123456dc MapFake (ProcFake+645)", +#endif + backtrace->FormatFrameData(&frame)); } struct map_test_t { |