bfd/
	* elf.c (assign_file_positions_for_load_sections): Set sh_offset for
	.tbss, and page align same for all SHT_NOBITS sections.
ld/
	* ldlang.c (lang_output_section_find_by_flags): Match orphan .sdata2
	like sections to existing .sdata2, and similarly for orphan TLS
	sections.
	* emultempl/elf32.em (place_orphan): Exclude .tbss from orphan_bss.
This commit is contained in:
Alan Modra 2011-05-23 05:41:01 +00:00
parent 3bd61671c3
commit 6de6a7fe35
4 changed files with 39 additions and 6 deletions

View file

@ -1,3 +1,9 @@
2011-05-23 Alan Modra <amodra@gmail.com>
PR 12763
* elf.c (assign_file_positions_for_load_sections): Set sh_offset for
.tbss, and page align same for all SHT_NOBITS sections.
2011-05-21 Alan Modra <amodra@gmail.com> 2011-05-21 Alan Modra <amodra@gmail.com>
PR 12763 PR 12763

View file

@ -4684,11 +4684,24 @@ assign_file_positions_for_load_sections (bfd *abfd,
} }
else else
{ {
if (p->p_type == PT_LOAD) if (p->p_type == PT_LOAD
|| (this_hdr->sh_type == SHT_NOBITS
&& (this_hdr->sh_flags & SHF_TLS) != 0
&& this_hdr->sh_offset == 0))
{ {
this_hdr->sh_offset = sec->filepos = off; if (this_hdr->sh_type == SHT_NOBITS)
if (this_hdr->sh_type != SHT_NOBITS) {
off += this_hdr->sh_size; /* 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;
}
} }
if (this_hdr->sh_type != SHT_NOBITS) if (this_hdr->sh_type != SHT_NOBITS)

View file

@ -1,3 +1,11 @@
2011-05-23 Alan Modra <amodra@gmail.com>
PR 12763
* ldlang.c (lang_output_section_find_by_flags): Match orphan .sdata2
like sections to existing .sdata2, and similarly for orphan TLS
sections.
* emultempl/elf32.em (place_orphan): Exclude .tbss from orphan_bss.
2011-05-17 Tomohiro Kashiwada <kikairoya@gmail.com> 2011-05-17 Tomohiro Kashiwada <kikairoya@gmail.com>
PR ld/12759 PR ld/12759

View file

@ -1579,8 +1579,14 @@ lang_output_section_find_by_flags (const asection *sec,
} }
flags ^= sec->flags; flags ^= sec->flags;
if (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD if (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
| SEC_READONLY)) | SEC_READONLY | SEC_SMALL_DATA))
&& !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL))) || (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
| SEC_READONLY))
&& !(look->flags & SEC_SMALL_DATA))
|| (!(flags & (SEC_THREAD_LOCAL | SEC_ALLOC))
&& (look->flags & SEC_THREAD_LOCAL)
&& (!(flags & SEC_LOAD)
|| (look->flags & SEC_LOAD))))
found = look; found = look;
} }
} }