AIX: wrong address for shared object's .bss section
authorJoel Brobecker <brobecker@gnat.com>
Fri, 10 May 2013 12:55:13 +0000 (12:55 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 10 May 2013 12:55:13 +0000 (12:55 +0000)
gdb/ChangeLog:

        * solib-aix.c (solib_aix_relocate_section_addresses):
        For the .bss section action, apply the same offset as
        the .data section.

gdb/ChangeLog
gdb/solib-aix.c

index 7ee965a..9f7b972 100644 (file)
@@ -1,5 +1,11 @@
 2013-05-10  Joel Brobecker  <brobecker@adacore.com>
 
+       * solib-aix.c (solib_aix_relocate_section_addresses):
+       For the .bss section action, apply the same offset as
+       the .data section.
+
+2013-05-10  Joel Brobecker  <brobecker@adacore.com>
+
        PR tdep/15420:
        * sol-thread.c (ps_lgetxregsize, ps_lgetxregs, ps_lsetxregs):
        New functions, directly copied from sparc-sol-thread.c.
index 9fa5de9..4672b58 100644 (file)
@@ -411,7 +411,21 @@ solib_aix_relocate_section_addresses (struct so_list *so,
     }
   else if (strcmp (section_name, ".bss") == 0)
     {
-      sec->addr = bfd_section_vma (abfd, bfd_sect) + info->data_addr;
+      /* The information provided by the loader does not include
+        the address of the .bss section, but we know that it gets
+        relocated by the same offset as the .data section.  So,
+        compute the relocation offset for the .data section, and
+        apply it to the .bss section as well.  If the .data section
+        is not defined (which seems highly unlikely), do our best
+        by assuming no relocation.  */
+      struct bfd_section *data_sect
+       = bfd_get_section_by_name (abfd, ".data");
+      CORE_ADDR data_offset = 0;
+
+      if (data_sect != NULL)
+       data_offset = info->data_addr - bfd_section_vma (abfd, data_sect);
+
+      sec->addr = bfd_section_vma (abfd, bfd_sect) + data_offset;
       sec->addr += solib_aix_bss_data_overlap (abfd);
       sec->endaddr = sec->addr + bfd_section_size (abfd, bfd_sect);
     }