]> sourceware.org Git - systemtap.git/commitdiff
PR11173 Markers get a bad address in prelinked libraries.
authorMark Wielaard <mjw@redhat.com>
Mon, 18 Jan 2010 08:13:30 +0000 (09:13 +0100)
committerMark Wielaard <mjw@redhat.com>
Mon, 18 Jan 2010 08:20:25 +0000 (09:20 +0100)
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.

dwflpp.cxx
dwflpp.h
tapsets.cxx

index 7dd31d06cbca0c7a8efc0e18805f36346c6b5dd2..e6fe017d4a25d220a5b6dd6ae8724bdea356eaa8 100644 (file)
@@ -2771,45 +2771,6 @@ dwflpp::relocate_address(Dwarf_Addr dw_addr, string& reloc_section)
   return reloc_addr;
 }
 
-/* Converts a "global" literal address to the module symbol address
- * space.  If necessary (not for kernel and executables using absolute
- * addresses), this adjust the address for the current module symbol
- * bias.  Literal addresses are provided by the user (or contained on
- * the .probes section) based on the "on disk" layout of the module.
- */
-Dwarf_Addr
-dwflpp::literal_addr_to_sym_addr(Dwarf_Addr lit_addr)
-{
-  if (sess.verbose > 2)
-    clog << "literal_addr_to_sym_addr 0x" << hex << lit_addr << dec << endl;
-
-  // Assume the address came from the symbol list.
-  // If we cannot get the symbol bias fall back on the dw bias.
-  // The kernel (and other absolute executable modules) is special though.
-  if (module_name != TOK_KERNEL
-      && dwfl_module_relocations (module) > 0)
-    {
-      Dwarf_Addr symbias = ~0;
-      if (dwfl_module_getsymtab (module) != -1)
-       dwfl_module_info (module, NULL, NULL, NULL, NULL,
-                         &symbias, NULL, NULL);
-
-      if (sess.verbose > 3)
-        clog << "symbias 0x" << hex << symbias << dec
-            << ", dwbias 0x" << hex << module_bias << dec << endl;
-
-      if (symbias == (Dwarf_Addr) ~0)
-       symbias = module_bias;
-
-      lit_addr += symbias;
-    }
-
-  if (sess.verbose > 2)
-    clog << "literal_addr_to_sym_addr ret 0x" << hex << lit_addr << dec << endl;
-
-  return lit_addr;
-}
-
 /* Returns the call frame address operations for the given program counter
  * in the libdw address space.
  */
index cdc6ad98a7955ac73045a244b5c5d814e1566255..523dd883db25d257a9ace9d00b1113d92ef6b43e 100644 (file)
--- a/dwflpp.h
+++ b/dwflpp.h
@@ -284,8 +284,6 @@ struct dwflpp
 
   Dwarf_Addr relocate_address(Dwarf_Addr addr, std::string& reloc_section);
 
-  Dwarf_Addr literal_addr_to_sym_addr(Dwarf_Addr lit_addr);
-
 
 private:
   DwflPtr dwfl_ptr;
index 071f92dbc310ce58ddf3c3e252311ef77d252159..d5c6b25ee529390a4a53c298efccaa54b31d51e3 100644 (file)
@@ -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);
This page took 0.047584 seconds and 5 git commands to generate.