diff options
author | Joel Brobecker <brobecker@gnat.com> | 2013-05-10 12:55:13 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2013-05-10 12:55:13 +0000 |
commit | 6ac38df064fe8efd580ebb9426bbedd343de78c5 (patch) | |
tree | b89e824bb7d5e6977e9ef9acf16ff9d66fe6ffe9 | |
parent | 77c8328144b9f4724ec07ec612e65bdbd20b04fb (diff) | |
download | gdb-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.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/solib-aix.c | 16 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7ee965a2049..9f7b97228da 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. 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); } |