link_map: Use proper bias, not l_addr
authorJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 21 Nov 2013 14:28:02 +0000 (15:28 +0100)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 21 Nov 2013 14:28:02 +0000 (15:28 +0100)
Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
libdwfl/ChangeLog
libdwfl/core-file.c
libdwfl/libdwflP.h
libdwfl/link_map.c

index 67ae84a..c0fbc83 100644 (file)
@@ -1,3 +1,15 @@
+2013-11-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       link_map: Use proper bias, not l_addr.
+       * core-file.c (dynamic_vaddr_get): Rename to ...
+       (__libdwfl_dynamic_vaddr_get): ... here, make it global,
+       internal_function.
+       (dwfl_core_file_report): Update name in the caller.
+       * libdwflP.h (__libdwfl_dynamic_vaddr_get): New declaration.
+       * link_map.c (report_r_debug): New variable elf_dynamic_vaddr.  Call
+       __libdwfl_dynamic_vaddr_get for it.  Remove L_ADDR FIXME comment.
+       Use ELF_DYNAMIC_VADDR instead of L_ADDR.
+
 2013-11-19  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Compatibility with older kernels such as RHEL-6.
index f9120ca..92745bd 100644 (file)
@@ -397,8 +397,9 @@ clear_r_debug_info (struct r_debug_info *r_debug_info)
     }
 }
 
-static bool
-dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
+bool
+internal_function
+__libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
 {
   size_t phnum;
   if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
@@ -525,7 +526,7 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
       if (module->elf == NULL)
        continue;
       GElf_Addr file_dynamic_vaddr;
-      if (! dynamic_vaddr_get (module->elf, &file_dynamic_vaddr))
+      if (! __libdwfl_dynamic_vaddr_get (module->elf, &file_dynamic_vaddr))
        continue;
       Dwfl_Module *mod;
       mod = __libdwfl_report_elf (dwfl, basename (module->name), module->name,
index 0c862b3..b8a64d8 100644 (file)
@@ -558,6 +558,11 @@ extern Dwfl_Error __libdw_open_file (int *fdp, Elf **elfp,
                                     bool close_on_fail, bool archive_ok)
   internal_function;
 
+/* Fetch PT_DYNAMIC P_VADDR from ELF and store it to *VADDRP.  Return success.
+   *VADDRP is not modified if the function fails.  */
+extern bool __libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
+  internal_function;
+
 /* These are working nicely for --core, but are not ready to be
    exported interfaces quite yet.  */
 
index b094b9b..b30f2e3 100644 (file)
@@ -388,17 +388,15 @@ report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
            {
              Elf *elf;
              Dwfl_Error error = __libdw_open_file (&fd, &elf, true, false);
-             if (error == DWFL_E_NOERROR)
+             GElf_Addr elf_dynamic_vaddr;
+             if (error == DWFL_E_NOERROR
+                 && __libdwfl_dynamic_vaddr_get (elf, &elf_dynamic_vaddr))
                {
                  const void *build_id_bits;
                  GElf_Addr build_id_elfaddr;
                  int build_id_len;
                  bool valid = true;
 
-                 /* FIXME: Bias L_ADDR should be computed from the prelink
-                    state in memory (when the file got loaded), not against
-                    the current on-disk file state as is computed below.  */
-
                  if (__libdwfl_find_elf_build_id (NULL, elf, &build_id_bits,
                                                   &build_id_elfaddr,
                                                   &build_id_len) > 0
@@ -406,7 +404,9 @@ report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
                    {
                      if (r_debug_info_module != NULL)
                        r_debug_info_module->disk_file_has_build_id = true;
-                     GElf_Addr build_id_vaddr = build_id_elfaddr + l_addr;
+                     GElf_Addr build_id_vaddr = (build_id_elfaddr
+                                                 - elf_dynamic_vaddr + l_ld);
+
                      release_buffer (0);
                      int segndx = INTUSE(dwfl_addrsegment) (dwfl,
                                                             build_id_vaddr,