aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf.c21
-rw-r--r--ld/ChangeLog8
-rw-r--r--ld/ldlang.c10
4 files changed, 39 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4517a4f..36675c2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>
PR 12763
diff --git a/bfd/elf.c b/bfd/elf.c
index ffc9c8e..3d44ef8 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4684,11 +4684,24 @@ assign_file_positions_for_load_sections (bfd *abfd,
}
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)
- off += this_hdr->sh_size;
+ 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;
+ }
}
if (this_hdr->sh_type != SHT_NOBITS)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index d0b2157..2cce57b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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>
PR ld/12759
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 5ccb36f..7cf5108 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1579,8 +1579,14 @@ lang_output_section_find_by_flags (const asection *sec,
}
flags ^= sec->flags;
if (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
- | SEC_READONLY))
- && !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
+ | SEC_READONLY | SEC_SMALL_DATA))
+ || (!(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;
}
}