diff options
author | Alan Modra <amodra@gmail.com> | 2011-06-24 03:36:40 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2011-06-24 03:36:40 +0000 |
commit | 1e951488fd8ea41b7527541a600e912b01546ab3 (patch) | |
tree | c864f97c3133ed29620a519fa4f40e7b1b145d76 | |
parent | a1d509b32e05e201fdce54306f46592923d7626e (diff) | |
download | gdb-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.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf.c | 36 |
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. @@ -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) |