Improve orphaned TLS section handling
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 22 Jan 2014 19:24:12 +0000 (11:24 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 24 Jan 2014 16:56:07 +0000 (08:56 -0800)
ld/

PR ld/16498
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Improve
orphaned TLS section handling.

ld/testsuite/

PR ld/16498
* ld-elf/pr16498a.d: New file.
* ld-elf/pr16498a.s: Likewise.
* ld-elf/pr16498a.t: Likewise.

ld/ChangeLog
ld/emultempl/elf32.em
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/pr16498a.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr16498a.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr16498a.t [new file with mode: 0644]

index 9beee8c..dcf0b15 100644 (file)
@@ -1,3 +1,9 @@
+2014-01-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/16498
+       * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Improve
+       orphaned TLS section handling.
+
 2014-01-24  Alan Modra  <amodra@gmail.com>
 
        * ldlang.c (lang_output_section_find_by_flags): Be careful to
index a4f04f1..fda0e68 100644 (file)
@@ -1812,6 +1812,9 @@ gld${EMULATION_NAME}_place_orphan (asection *s,
       { ".rodata",
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
        0, 0, 0, 0 },
+      { ".tdata",
+       SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_THREAD_LOCAL,
+       0, 0, 0, 0 },
       { ".data",
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
        0, 0, 0, 0 },
@@ -1835,6 +1838,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s,
     {
       orphan_text = 0,
       orphan_rodata,
+      orphan_tdata,
       orphan_data,
       orphan_bss,
       orphan_rel,
@@ -1962,6 +1966,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s,
     place = &hold[orphan_bss];
   else if ((s->flags & SEC_SMALL_DATA) != 0)
     place = &hold[orphan_sdata];
+  else if ((s->flags & SEC_THREAD_LOCAL) != 0)
+    place = &hold[orphan_tdata];
   else if ((s->flags & SEC_READONLY) == 0)
     place = &hold[orphan_data];
   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
index a269b07..4f0a75b 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/16498
+       * ld-elf/pr16498a.d: New file.
+       * ld-elf/pr16498a.s: Likewise.
+       * ld-elf/pr16498a.t: Likewise.
+
 2014-01-22  Alan Modra  <amodra@gmail.com>
 
        * ld-scripts/pr14962-2.d: Correct target triple.
diff --git a/ld/testsuite/ld-elf/pr16498a.d b/ld/testsuite/ld-elf/pr16498a.d
new file mode 100644 (file)
index 0000000..436bf97
--- /dev/null
@@ -0,0 +1,9 @@
+#ld: -shared -T pr16498a.t
+#readelf: -l --wide
+#target: *-*-linux* *-*-gnu* *-*-nacl*
+
+#...
+  TLS .*
+#...
+[ ]+[0-9]+[ ]+.tdata .tbss[ ]*
+#pass
diff --git a/ld/testsuite/ld-elf/pr16498a.s b/ld/testsuite/ld-elf/pr16498a.s
new file mode 100644 (file)
index 0000000..77f80e6
--- /dev/null
@@ -0,0 +1,23 @@
+       .globl  data
+       .data
+       .align 32
+       .type   data, %object
+       .size   data, 120
+data:
+       .long   1
+       .zero   116
+       .globl  foo
+       .section        .tbss,"awT",%nobits
+       .align 4
+       .type   foo, %object
+       .size   foo, 4
+foo:
+       .zero   4
+       .globl  bar
+       .section        .tdata,"awT",%progbits
+       .align 16
+       .type   bar, %object
+       .size   bar, 80
+bar:
+       .long   1
+       .zero   76
diff --git a/ld/testsuite/ld-elf/pr16498a.t b/ld/testsuite/ld-elf/pr16498a.t
new file mode 100644 (file)
index 0000000..928724f
--- /dev/null
@@ -0,0 +1,6 @@
+SECTIONS
+{
+  .tdata  : { *(.tdata) }
+  .data          : { *(.data)
+  }
+}