]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Fix compuation of base address for printing stack frame program.
authorUlrich Drepper <drepper@redhat.com>
Sun, 25 Jan 2009 01:01:08 +0000 (17:01 -0800)
committerUlrich Drepper <drepper@redhat.com>
Sun, 25 Jan 2009 01:01:08 +0000 (17:01 -0800)
src/ChangeLog
src/readelf.c

index 6203f712a2d35320dfcfe636c03d7e7a150c0d51..4886bcf2c48a05f0a3a386dcaaa88bced56ebba7 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-24  Ulrich Drepper  <drepper@redhat.com>
+
+       * readelf.c (print_debug_frame_section): Fix computation of vma_base
+       for PC-relative mode.
+
 2009-01-23  Ulrich Drepper  <drepper@redhat.com>
 
        * size.c (process_file): When handling archive, close file descriptor
index 88eb9a7c8bc87162a528d18e5b6b769a90082208..55c906f7de5806a396dfadaf52eabfa0dfd4d336 100644 (file)
@@ -4643,6 +4643,7 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
       unsigned int fde_encoding = 0;
       unsigned int lsda_encoding = 0;
       Dwarf_Word initial_location = 0;
+      Dwarf_Word vma_base = 0;
 
       if (cie_id == (is_eh_frame ? 0 : DW_CIE_ID))
        {
@@ -4809,16 +4810,26 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                  cie->cie_offset, (uint64_t) cie_id,
                  (uint64_t) initial_location);
          if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
-           printf (gettext (" (offset: %#" PRIx64 ")"),
-                   ((uint64_t) shdr->sh_offset
-                    + (base - (const unsigned char *) data->d_buf)
-                    + (uint64_t) initial_location)
+           {
+             vma_base = (((uint64_t) shdr->sh_offset
+                          + (base - (const unsigned char *) data->d_buf)
+                          + (uint64_t) initial_location)
+                         & (ptr_size == 4
+                            ? UINT64_C (0xffffffff)
+                            : UINT64_C (0xffffffffffffffff)));
+             printf (gettext (" (offset: %#" PRIx64 ")"),
+                     (uint64_t) vma_base);
+           }
+
+         printf ("\n   address_range:            %#" PRIx64,
+                 (uint64_t) address_range);
+         if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
+           printf (gettext (" (end offset: %#" PRIx64 ")"),
+                   ((uint64_t) vma_base + (uint64_t) address_range)
                    & (ptr_size == 4
                       ? UINT64_C (0xffffffff)
                       : UINT64_C (0xffffffffffffffff)));
-
-         printf ("\n   address_range:            %#" PRIx64 "\n",
-                 (uint64_t) address_range);
+         putchar ('\n');
 
          if (cie->augmentation[0] == 'z')
            {
@@ -4859,13 +4870,6 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
            }
        }
 
-      /* To print correct addresses compute the base address.  */
-      Dwarf_Word vma_base;
-      if ((fde_encoding & 0x70) == DW_EH_PE_pcrel && ehdr->e_type != ET_REL)
-       vma_base = shdr->sh_addr + initial_location;
-      else
-       vma_base = 0;
-
       /* Handle the initialization instructions.  */
       print_cfa_program (readp, cieend, vma_base, code_alignment_factor,
                         data_alignment_factor, ptr_size, dwflmod, ebl, dbg);