aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2011-06-24 03:36:40 +0000
committerAlan Modra <amodra@gmail.com>2011-06-24 03:36:40 +0000
commit1e951488fd8ea41b7527541a600e912b01546ab3 (patch)
treec864f97c3133ed29620a519fa4f40e7b1b145d76 /bfd
parenta1d509b32e05e201fdce54306f46592923d7626e (diff)
downloadgdb-1e951488fd8ea41b7527541a600e912b01546ab3.zip
gdb-1e951488fd8ea41b7527541a600e912b01546ab3.tar.gz
gdb-1e951488fd8ea41b7527541a600e912b01546ab3.tar.bz2
PR ld/12921
* elf.c (assign_file_positions_for_load_sections): Don't align sh_offset for all SHT_NOBITS sections here, just .tbss sections that don't get a PT_LOAD.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf.c36
2 files changed, 26 insertions, 17 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 877f0c8..066713d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2011-06-24 Alan Modra <amodra@gmail.com>
+
+ PR ld/12921
+ * elf.c (assign_file_positions_for_load_sections): Don't align
+ sh_offset for all SHT_NOBITS sections here, just .tbss sections
+ that don't get a PT_LOAD.
+
2011-06-22 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* elf32-sh.c (sh_elf_relocate_section): Allow R_SH_TLS_LE_32 for PIE.
diff --git a/bfd/elf.c b/bfd/elf.c
index 15e9087..0c1eb7d 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4684,24 +4684,26 @@ assign_file_positions_for_load_sections (bfd *abfd,
}
else
{
- if (p->p_type == PT_LOAD
- || (this_hdr->sh_type == SHT_NOBITS
- && (this_hdr->sh_flags & SHF_TLS) != 0
- && this_hdr->sh_offset == 0))
+ if (p->p_type == PT_LOAD)
{
- if (this_hdr->sh_type == SHT_NOBITS)
- {
- /* These sections don't really need sh_offset,
- but give them one anyway. */
- bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
- off, align);
- this_hdr->sh_offset = sec->filepos = off + adjust;
- }
- else
- {
- this_hdr->sh_offset = sec->filepos = off;
- off += this_hdr->sh_size;
- }
+ this_hdr->sh_offset = sec->filepos = off;
+ if (this_hdr->sh_type != SHT_NOBITS)
+ off += this_hdr->sh_size;
+ }
+ else if (this_hdr->sh_type == SHT_NOBITS
+ && (this_hdr->sh_flags & SHF_TLS) != 0
+ && this_hdr->sh_offset == 0)
+ {
+ /* This is a .tbss section that didn't get a PT_LOAD.
+ (See _bfd_elf_map_sections_to_segments "Create a
+ final PT_LOAD".) Set sh_offset to the value it
+ would have if we had created a zero p_filesz and
+ p_memsz PT_LOAD header for the section. This
+ also makes the PT_TLS header have the same
+ p_offset value. */
+ bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
+ off, align);
+ this_hdr->sh_offset = sec->filepos = off + adjust;
}
if (this_hdr->sh_type != SHT_NOBITS)