]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
.
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 28 Oct 2012 12:33:14 +0000 (13:33 +0100)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 28 Oct 2012 12:33:14 +0000 (13:33 +0100)
libdwfl/dwfl_report_elf.c
libdwfl/libdwfl.h
libdwfl/libdwflP.h
libdwfl/offline.c

index e7a9592a91fa0a1e19773ef9fe8d9fd27505720c..1524bc48192bb4f7212678ef906d676bb476cf4e 100644 (file)
@@ -182,11 +182,19 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
            {
              vaddr = ph->p_vaddr & -ph->p_align;
              address_sync = ph->p_vaddr + ph->p_memsz;
-             start = base + vaddr;
              break;
            }
        }
-      bias = base;
+      if (base_is_bias)
+       {
+         start = base + vaddr;
+         bias = base;
+       }
+      else
+       {
+         start = base;
+         bias = base - vaddr;
+       }
 
       for (size_t i = phnum; i-- > 0;)
        {
index 000d582f5bb63479aec3d19882a6909f84adcf2d..cb0341451bddf44bb6d88a1e306ebdcaee7babf9 100644 (file)
@@ -146,6 +146,13 @@ extern Dwfl_Module *dwfl_report_elf (Dwfl *dwfl, const char *name,
                                     const char *file_name, int fd,
                                     GElf_Addr base);
 
+/* See dwfl_report_elf except that BASE is the page-aligned absolute VMA
+   address where the ELF file should start.  Any possible file prelinking of
+   the disk file is compensated.  */
+extern Dwfl_Module *dwfl_report_elf_baseaddr (Dwfl *dwfl, const char *name,
+                                             const char *file_name, int fd,
+                                             GElf_Addr base);
+
 /* Similar, but report the module for offline use.  All ET_EXEC files
    being reported must be reported before any relocatable objects.
    If this is used, dwfl_report_module and dwfl_report_elf may not be
index ca8be2f2a557374afd0c142a4d3903c6d439d8bc..e5e638c98fdc76a7713b71deb62b42df3d349f55 100644 (file)
@@ -353,7 +353,8 @@ extern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
    Consumes ELF on success, not on failure.  */
 extern Dwfl_Module *__libdwfl_report_elf (Dwfl *dwfl, const char *name,
                                          const char *file_name, int fd,
-                                         Elf *elf, GElf_Addr base, bool sanity)
+                                         Elf *elf, GElf_Addr base,
+                                         bool base_is_bias, bool sanity)
   internal_function;
 
 /* Meat of dwfl_report_offline.  */
index 26a6bd664dd55b1b284018c044ca1dc72f452933..28d2782e8a879a2ef6e18973738aacb3427b25e2 100644 (file)
@@ -127,7 +127,8 @@ process_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
             Elf *elf)
 {
   Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name, fd, elf,
-                                          dwfl->offline_next_address, false);
+                                          dwfl->offline_next_address, true,
+                                          false);
   if (mod != NULL)
     {
       /* If this is an ET_EXEC file with fixed addresses, the address range