From 08d1d520616557f6ff7dd023e260ad6577e9e0e8 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 18 Jan 2010 09:13:30 +0100 Subject: [PATCH] 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. --- dwflpp.cxx | 39 --------------------------------------- dwflpp.h | 2 -- tapsets.cxx | 11 +++++++++-- 3 files changed, 9 insertions(+), 43 deletions(-) diff --git a/dwflpp.cxx b/dwflpp.cxx index 7dd31d06c..e6fe017d4 100644 --- a/dwflpp.cxx +++ b/dwflpp.cxx @@ -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. */ diff --git a/dwflpp.h b/dwflpp.h index cdc6ad98a..523dd883d 100644 --- 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; diff --git a/tapsets.cxx b/tapsets.cxx index 071f92dbc..d5c6b25ee 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); -- 2.43.5