summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2010-01-18 09:13:30 +0100
committerMark Wielaard <mjw@redhat.com>2010-01-18 09:20:25 +0100
commit08d1d520616557f6ff7dd023e260ad6577e9e0e8 (patch)
treef9c9efe542ca78826caedb6f8981fa73336552d5 /tapsets.cxx
parent27ca40f711f4ab4b0234390443e63b7916a61551 (diff)
downloadsystemtap-steved-08d1d520616557f6ff7dd023e260ad6577e9e0e8.tar.gz
systemtap-steved-08d1d520616557f6ff7dd023e260ad6577e9e0e8.tar.xz
systemtap-steved-08d1d520616557f6ff7dd023e260ad6577e9e0e8.zip
PR11173 Markers get a bad address in prelinked libraries.
Our literal_addr_to_sym_addr() function was just wrong. To compensate for raw addresses read from elf (either given by the user or through a mark transformation) we need to know what the elf_bias is (as returned by dwfl_module_getelf) before feeding them to any libdwfl functions. * tapsets.cxx (query_module_dwarf): Always add elf_bias to raw function or statement addresses before calling query_addr(). (query_addr): Don't call literal_addr_to_sym_addr(). * dwflpp.h (literal_addr_to_sym_addr): Removed. * dwflpp.cxx (literal_addr_to_sym_addr): Likewise.
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx11
1 files changed, 9 insertions, 2 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 071f92db..d5c6b25e 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -761,6 +761,13 @@ dwarf_query::query_module_dwarf()
// number plus the module's bias.
Dwarf_Addr addr = has_function_num ?
function_num_val : statement_num_val;
+
+ // These are raw addresses, we need to know what the elf_bias
+ // is to feed it to libdwfl based functions.
+ Dwarf_Addr elf_bias;
+ Elf *elf = dwfl_module_getelf (dw.module, &elf_bias);
+ assert(elf);
+ addr += elf_bias;
query_addr(addr, this);
}
else
@@ -1168,8 +1175,8 @@ query_addr(Dwarf_Addr addr, dwarf_query *q)
{
dwflpp &dw = q->dw;
- // Translate to and actual sumbol address.
- addr = dw.literal_addr_to_sym_addr(addr);
+ if (q->sess.verbose > 2)
+ clog << "query_addr 0x" << hex << addr << dec << endl;
// First pick which CU contains this address
Dwarf_Die* cudie = dw.query_cu_containing_address(addr);