This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit] AIX: wrong address for shared object's .bss section
- From: Joel Brobecker <brobecker at adacore dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 10 May 2013 16:59:38 +0400
- Subject: [commit] AIX: wrong address for shared object's .bss section
Hello,
While reading the solib-aix code, I noticed an error in the way
I computed the relocated address of the .bss sections for shared
objects...
gdb/ChangeLog:
* solib-aix.c (solib_aix_relocate_section_addresses):
For the .bss section action, apply the same offset as
the .data section.
Tested on ppc-aix. Checked in.
---
gdb/ChangeLog | 6 ++++++
gdb/solib-aix.c | 16 +++++++++++++++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7ee965a..9f7b972 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 9fa5de9..4672b58 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);
}
--
1.7.10.4