summaryrefslogtreecommitdiff
path: root/gdb/solib-aix.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2013-05-10 12:55:13 +0000
committerJoel Brobecker <brobecker@gnat.com>2013-05-10 12:55:13 +0000
commit6ac38df064fe8efd580ebb9426bbedd343de78c5 (patch)
treeb89e824bb7d5e6977e9ef9acf16ff9d66fe6ffe9 /gdb/solib-aix.c
parent77c8328144b9f4724ec07ec612e65bdbd20b04fb (diff)
downloadgdb-6ac38df064fe8efd580ebb9426bbedd343de78c5.tar.gz
AIX: wrong address for shared object's .bss section
gdb/ChangeLog: * solib-aix.c (solib_aix_relocate_section_addresses): For the .bss section action, apply the same offset as the .data section.
Diffstat (limited to 'gdb/solib-aix.c')
-rw-r--r--gdb/solib-aix.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c
index 9fa5de9f6f5..4672b588ce3 100644
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -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);
}