aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog51
-rw-r--r--ld/testsuite/ld-x86-64/pass.out1
-rw-r--r--ld/testsuite/ld-x86-64/tls-def1.c1
-rw-r--r--ld/testsuite/ld-x86-64/tls-gd1.S55
-rw-r--r--ld/testsuite/ld-x86-64/tls-ld1.S47
-rw-r--r--ld/testsuite/ld-x86-64/tls-main1.c29
-rw-r--r--ld/testsuite/ld-x86-64/tls.exp125
-rw-r--r--ld/testsuite/ld-x86-64/tlsbin2-nacl.rd143
-rw-r--r--ld/testsuite/ld-x86-64/tlsbin2.dd310
-rw-r--r--ld/testsuite/ld-x86-64/tlsbin2.rd141
-rw-r--r--ld/testsuite/ld-x86-64/tlsbin2.sd13
-rw-r--r--ld/testsuite/ld-x86-64/tlsbin2.td16
-rw-r--r--ld/testsuite/ld-x86-64/tlsbinpic2.s146
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd10.dd23
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd10.s18
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd11.dd14
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd11.s15
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd12.d4
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd12.s5
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd13.d4
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd13.s11
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd14.dd10
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd14.s14
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd5.dd2
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd5c.s8
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd6.dd2
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd6c.s7
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd9.dd23
-rw-r--r--ld/testsuite/ld-x86-64/tlsgd9.s25
-rw-r--r--ld/testsuite/ld-x86-64/tlsld4.dd23
-rw-r--r--ld/testsuite/ld-x86-64/tlsld4.s27
-rw-r--r--ld/testsuite/ld-x86-64/tlsld5.dd13
-rw-r--r--ld/testsuite/ld-x86-64/tlsld5.s12
-rw-r--r--ld/testsuite/ld-x86-64/tlsld6.dd14
-rw-r--r--ld/testsuite/ld-x86-64/tlsld6.s12
-rw-r--r--ld/testsuite/ld-x86-64/tlspic2-nacl.rd145
-rw-r--r--ld/testsuite/ld-x86-64/tlspic2.dd378
-rw-r--r--ld/testsuite/ld-x86-64/tlspic2.rd139
-rw-r--r--ld/testsuite/ld-x86-64/tlspic2.sd20
-rw-r--r--ld/testsuite/ld-x86-64/tlspic2.td16
-rw-r--r--ld/testsuite/ld-x86-64/tlspic3.s290
-rw-r--r--ld/testsuite/ld-x86-64/tlspie2.s58
-rw-r--r--ld/testsuite/ld-x86-64/tlspie2a.d6
-rw-r--r--ld/testsuite/ld-x86-64/tlspie2b.d28
-rw-r--r--ld/testsuite/ld-x86-64/tlspie2c.d28
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp60
46 files changed, 2527 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 071036f..96b844b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,54 @@
+2016-06-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * testsuite/ld-x86-64/pass.out: New file.
+ * testsuite/ld-x86-64/tls-def1.c: Likewise.
+ * testsuite/ld-x86-64/tls-gd1.S: Likewise.
+ * testsuite/ld-x86-64/tls-ld1.S: Likewise.
+ * testsuite/ld-x86-64/tls-main1.c: Likewise.
+ * testsuite/ld-x86-64/tls.exp: Likewise.
+ * testsuite/ld-x86-64/tlsbin2-nacl.rd: Likewise.
+ * testsuite/ld-x86-64/tlsbin2.dd: Likewise.
+ * testsuite/ld-x86-64/tlsbin2.rd: Likewise.
+ * testsuite/ld-x86-64/tlsbin2.sd: Likewise.
+ * testsuite/ld-x86-64/tlsbin2.td: Likewise.
+ * testsuite/ld-x86-64/tlsbinpic2.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd10.dd: Likewise.
+ * testsuite/ld-x86-64/tlsgd10.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd11.dd: Likewise.
+ * testsuite/ld-x86-64/tlsgd11.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd12.d: Likewise.
+ * testsuite/ld-x86-64/tlsgd12.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd13.d: Likewise.
+ * testsuite/ld-x86-64/tlsgd13.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd14.dd: Likewise.
+ * testsuite/ld-x86-64/tlsgd14.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd5c.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd6c.s: Likewise.
+ * testsuite/ld-x86-64/tlsgd9.dd: Likewise.
+ * testsuite/ld-x86-64/tlsgd9.s: Likewise.
+ * testsuite/ld-x86-64/tlsld4.dd: Likewise.
+ * testsuite/ld-x86-64/tlsld4.s: Likewise.
+ * testsuite/ld-x86-64/tlsld5.dd: Likewise.
+ * testsuite/ld-x86-64/tlsld5.s: Likewise.
+ * testsuite/ld-x86-64/tlsld6.dd: Likewise.
+ * testsuite/ld-x86-64/tlsld6.s: Likewise.
+ * testsuite/ld-x86-64/tlspic2-nacl.rd: Likewise.
+ * testsuite/ld-x86-64/tlspic2.dd: Likewise.
+ * testsuite/ld-x86-64/tlspic2.rd: Likewise.
+ * testsuite/ld-x86-64/tlspic2.sd: Likewise.
+ * testsuite/ld-x86-64/tlspic2.td: Likewise.
+ * testsuite/ld-x86-64/tlspic3.s: Likewise.
+ * testsuite/ld-x86-64/tlspie2.s: Likewise.
+ * testsuite/ld-x86-64/tlspie2a.d: Likewise.
+ * testsuite/ld-x86-64/tlspie2b.d: Likewise.
+ * testsuite/ld-x86-64/tlspie2c.d: Likewise.
+ * testsuite/ld-x86-64/tlsgd5.dd: Updated.
+ * testsuite/ld-x86-64/tlsgd6.dd: Likewise.
+ * testsuite/ld-x86-64/x86-64.exp: Run libtlspic2.so, tlsbin2,
+ tlsgd5b, tlsgd6b, tlsld4, tlsld5, tlsld6, tlsgd9, tlsgd10,
+ tlsgd11, tlsgd14, tlsgd12, tlsgd13, tlspie2a, tlspie2b and
+ tlspie2c.
+
2016-06-04 Christian Groessler <chris@groessler.org>
* testsuite/ld-z8k/0filler.s: New file.
diff --git a/ld/testsuite/ld-x86-64/pass.out b/ld/testsuite/ld-x86-64/pass.out
new file mode 100644
index 0000000..7ef22e9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pass.out
@@ -0,0 +1 @@
+PASS
diff --git a/ld/testsuite/ld-x86-64/tls-def1.c b/ld/testsuite/ld-x86-64/tls-def1.c
new file mode 100644
index 0000000..62470a9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tls-def1.c
@@ -0,0 +1 @@
+__thread int gd = 1;
diff --git a/ld/testsuite/ld-x86-64/tls-gd1.S b/ld/testsuite/ld-x86-64/tls-gd1.S
new file mode 100644
index 0000000..cf56675
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tls-gd1.S
@@ -0,0 +1,55 @@
+ .text
+ .p2align 4,,15
+ .globl get_gd
+ .type get_gd, @function
+get_gd:
+ subq $8, %rsp
+#ifdef __LP64__
+ .byte 0x66
+#endif
+ leaq gd@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ addq $8, %rsp
+ ret
+ .size get_gd, .-get_gd
+ .text
+ .p2align 4,,15
+ .globl set_gd
+ .type set_gd, @function
+set_gd:
+ pushq %rbx
+ movl %edi, %ebx
+#ifdef __LP64__
+ .byte 0x66
+#endif
+ leaq gd@tlsgd(%rip), %rdi
+ .value 0x6666
+ rex64
+ call __tls_get_addr@PLT
+ movl %ebx, (%rax)
+ popq %rbx
+ ret
+ .size set_gd, .-set_gd
+ .text
+ .p2align 4,,15
+ .globl test_gd
+ .type test_gd, @function
+test_gd:
+ pushq %rbx
+ movl %edi, %ebx
+#ifdef __LP64__
+ .byte 0x66
+#endif
+ leaq gd@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ cmpl %ebx, (%rax)
+ popq %rbx
+ sete %al
+ movzbl %al, %eax
+ ret
+ .size test_gd, .-test_gd
+ .section .note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/tls-ld1.S b/ld/testsuite/ld-x86-64/tls-ld1.S
new file mode 100644
index 0000000..a3cbc96
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tls-ld1.S
@@ -0,0 +1,47 @@
+ .text
+ .p2align 4,,15
+ .globl get_ld
+ .type get_ld, @function
+get_ld:
+ subq $8, %rsp
+ leaq ld@tlsld(%rip), %rdi
+ call __tls_get_addr@PLT
+ addq $8, %rsp
+ addq $ld@dtpoff, %rax
+ ret
+ .size get_ld, .-get_ld
+ .text
+ .p2align 4,,15
+ .globl set_ld
+ .type set_ld, @function
+set_ld:
+ pushq %rbx
+ movl %edi, %ebx
+ leaq ld@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ movl %ebx, ld@dtpoff(%rax)
+ popq %rbx
+ ret
+ .size set_ld, .-set_ld
+ .text
+ .p2align 4,,15
+ .globl test_ld
+ .type test_ld, @function
+test_ld:
+ pushq %rbx
+ movl %edi, %ebx
+ leaq ld@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ cmpl %ebx, ld@dtpoff(%rax)
+ popq %rbx
+ sete %al
+ movzbl %al, %eax
+ ret
+ .size test_ld, .-test_ld
+ .section .tbss,"awT",@nobits
+ .align 4
+ .type ld, @object
+ .size ld, 4
+ld:
+ .zero 4
+ .section .note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/tls-main1.c b/ld/testsuite/ld-x86-64/tls-main1.c
new file mode 100644
index 0000000..5c33744
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tls-main1.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int * get_gd (void);
+extern void set_gd (int);
+extern int test_gd (int);
+extern int * get_ld (void);
+extern void set_ld (int);
+extern int test_ld (int);
+
+int
+main ()
+{
+ int *p;
+
+ p = get_gd ();
+ set_gd (3);
+ if (*p != 3 || !test_gd (3))
+ abort ();
+
+ p = get_ld ();
+ set_ld (4);
+ if (*p != 4 || !test_ld (4))
+ abort ();
+
+ printf ("PASS\n");
+
+ return 0;
+}
diff --git a/ld/testsuite/ld-x86-64/tls.exp b/ld/testsuite/ld-x86-64/tls.exp
new file mode 100644
index 0000000..081385f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tls.exp
@@ -0,0 +1,125 @@
+# Expect script for x86-64 TLS tests.
+# Copyright (C) 2016 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+# The following tests require running the executable generated by ld,
+# or enough of a build environment to create a fully linked executable.
+# This is not commonly available when testing a cross-built linker.
+if ![isnative] {
+ return
+}
+
+# Only on Linux for now.
+if ![istarget "x86_64-*-linux*"] {
+ return
+}
+
+# Check to see if the C compiler works
+if { [which $CC] == 0 } {
+ return
+}
+
+run_cc_link_tests [list \
+ [list \
+ "Build tls-def1.c tls-main1.c" \
+ "" \
+ "-fPIE" \
+ {tls-def1.c tls-main1.c} \
+ ] \
+ [list \
+ "Build tls-gd1.o tls-ld1.o" \
+ "" \
+ "-fPIC -Wa,-mrelax-relocations=yes" \
+ {tls-gd1.S tls-ld1.S} \
+ ] \
+ [list \
+ "Build libtls-1a.so" \
+ "-shared tmpdir/tls-def1.o" \
+ "" \
+ {dummy.s} \
+ {} \
+ "libtls-1a.so" \
+ ] \
+ [list \
+ "Build libtls-1b.so" \
+ "-shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \
+ "" \
+ {dummy.s} \
+ {} \
+ "libtls-1b.so" \
+ ] \
+]
+
+run_ld_link_exec_tests [] [list \
+ [list \
+ "TLS GD/LD -> LE transition without PLT (dynamic)" \
+ "tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
+ tmpdir/tls-ld1.o" \
+ "" \
+ { dummy.s } \
+ "tls-1a" \
+ "pass.out" \
+ ] \
+ [list \
+ "TLS GD/LD -> LE transition without PLT (PIE)" \
+ "-pie tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
+ tmpdir/tls-ld1.o" \
+ "" \
+ { dummy.s } \
+ "tls-1b" \
+ "pass.out" \
+ ] \
+ [list \
+ "TLS GD/LD -> LE transition without PLT (static)" \
+ "-static tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \
+ tmpdir/tls-ld1.o" \
+ "" \
+ { dummy.s } \
+ "tls-1c" \
+ "pass.out" \
+ ] \
+ [list \
+ "TLS GD/LD -> IE transition without PLT" \
+ "tmpdir/tls-main1.o tmpdir/tls-gd1.o tmpdir/tls-ld1.o \
+ tmpdir/libtls-1a.so -R tmpdir" \
+ "" \
+ { dummy.s } \
+ "tls-1d" \
+ "pass.out" \
+ ] \
+ [list \
+ "TLS without PLT (1)" \
+ "tmpdir/tls-main1.o \
+ tmpdir/libtls-1a.so tmpdir/libtls-1b.so -R tmpdir" \
+ "" \
+ { dummy.s } \
+ "tls-1e" \
+ "pass.out" \
+ ] \
+ [list \
+ "TLS without PLT (2)" \
+ "tmpdir/tls-main1.o tmpdir/tls-def1.o \
+ tmpdir/libtls-1b.so -R tmpdir" \
+ "" \
+ { dummy.s } \
+ "tls-1f" \
+ "pass.out" \
+ ] \
+]
diff --git a/ld/testsuite/ld-x86-64/tlsbin2-nacl.rd b/ld/testsuite/ld-x86-64/tlsbin2-nacl.rd
new file mode 100644
index 0000000..110927b
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbin2-nacl.rd
@@ -0,0 +1,143 @@
+#source: tlsbinpic2.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64_nacl --no-ld-generated-unwind-info
+#readelf: -WSsrl
+#target: x86_64-*-nacl*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .text +PROGBITS +0+20000 [0-9a-f]+ 0+233 00 +AX +0 +0 +4096
+ +\[[ 0-9]+\] .interp +.*
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+100303b0 [0-9a-f]+ 0+60 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .tbss +NOBITS +0+10030410 [0-9a-f]+ 0+40 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+10030410 [0-9a-f]+ 0+100 10 +WA +5 +0 +8
+ +\[[ 0-9]+\] .got +PROGBITS +0+10030510 [0-9a-f]+ 0+28 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+10030538 [0-9a-f]+ 0+18 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+#...
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x2013b
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +PHDR.*
+ +INTERP.*
+.*Requesting program interpreter.*
+ +LOAD +0x0+10000 0x0+20000 0x0+20000 0x0+10000 0x0+10000 R E +0x10000
+ +LOAD +0x0+ 0x0+10020000 0x0+10020000 0x0+3b0 0x0+3b0 R +0x10000
+ +LOAD +0x0+3b0 0x0+100303b0 0x0+100303b0 0x0+1a0 0x0+1a0 RW +0x10000
+ +DYNAMIC +0x0+410 0x0+10030410 0x0+10030410 0x0+100 0x0+100 RW +0x8
+ +TLS +0x0+3b0 0x0+100303b0 0x0+100303b0 0x0+60 0x0+a0 R +0x1
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 *
+ +01 +.interp *
+ +02 +.text *
+ +03 +.interp .hash .dynsym .dynstr .rela.dyn *
+ +04 +.tdata .dynamic .got .got.plt *
+ +05 +.dynamic *
+ +06 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 5 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG5 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG2 \+ 0
+[0-9a-f ]+R_X86_64_GLOB_DAT +0+ __tls_get_addr \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG6 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG1 \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* TLS +GLOBAL +DEFAULT +UND sG5
+.* TLS +GLOBAL +DEFAULT +UND sG2
+.* FUNC +GLOBAL +DEFAULT +UND __tls_get_addr
+.* NOTYPE +GLOBAL +DEFAULT +11 __bss_start
+.* TLS +GLOBAL +DEFAULT +UND sG6
+.* TLS +GLOBAL +DEFAULT +UND sG1
+.* NOTYPE +GLOBAL +DEFAULT +11 _edata
+.* NOTYPE +GLOBAL +DEFAULT +11 _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* SECTION +LOCAL +DEFAULT +1 *
+.* SECTION +LOCAL +DEFAULT +2 *
+.* SECTION +LOCAL +DEFAULT +3 *
+.* SECTION +LOCAL +DEFAULT +4 *
+.* SECTION +LOCAL +DEFAULT +5 *
+.* SECTION +LOCAL +DEFAULT +6 *
+.* SECTION +LOCAL +DEFAULT +7 *
+.* SECTION +LOCAL +DEFAULT +8 *
+.* SECTION +LOCAL +DEFAULT +9 *
+.* SECTION +LOCAL +DEFAULT +10 *
+.* SECTION +LOCAL +DEFAULT +11 *
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlsbinpic2.o
+.* TLS +LOCAL +DEFAULT +7 sl1
+.* TLS +LOCAL +DEFAULT +7 sl2
+.* TLS +LOCAL +DEFAULT +7 sl3
+.* TLS +LOCAL +DEFAULT +7 sl4
+.* TLS +LOCAL +DEFAULT +7 sl5
+.* TLS +LOCAL +DEFAULT +7 sl6
+.* TLS +LOCAL +DEFAULT +7 sl7
+.* TLS +LOCAL +DEFAULT +7 sl8
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlsbin.o
+.* TLS +LOCAL +DEFAULT +8 bl1
+.* TLS +LOCAL +DEFAULT +8 bl2
+.* TLS +LOCAL +DEFAULT +8 bl3
+.* TLS +LOCAL +DEFAULT +8 bl4
+.* TLS +LOCAL +DEFAULT +8 bl5
+.* TLS +LOCAL +DEFAULT +8 bl6
+.* TLS +LOCAL +DEFAULT +8 bl7
+.* TLS +LOCAL +DEFAULT +8 bl8
+.* FILE +LOCAL +DEFAULT +ABS
+.* OBJECT +LOCAL +DEFAULT +9 _DYNAMIC
+.* OBJECT +LOCAL +DEFAULT +11 _GLOBAL_OFFSET_TABLE_
+.* TLS +GLOBAL +DEFAULT +7 sg8
+.* TLS +GLOBAL +DEFAULT +8 bg8
+.* TLS +GLOBAL +DEFAULT +8 bg6
+.* TLS +GLOBAL +DEFAULT +UND sG5
+.* TLS +GLOBAL +DEFAULT +8 bg3
+.* TLS +GLOBAL +DEFAULT +7 sg3
+.* TLS +GLOBAL +HIDDEN +7 sh3
+.* TLS +GLOBAL +DEFAULT +UND sG2
+.* TLS +GLOBAL +DEFAULT +7 sg4
+.* TLS +GLOBAL +DEFAULT +7 sg5
+.* TLS +GLOBAL +DEFAULT +8 bg5
+.* FUNC +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +HIDDEN +7 sh7
+.* TLS +GLOBAL +HIDDEN +7 sh8
+.* TLS +GLOBAL +DEFAULT +7 sg1
+.* FUNC +GLOBAL +DEFAULT +1 _start
+.* TLS +GLOBAL +HIDDEN +7 sh4
+.* TLS +GLOBAL +DEFAULT +8 bg7
+.* TLS +GLOBAL +HIDDEN +7 sh5
+.* NOTYPE +GLOBAL +DEFAULT +11 __bss_start
+.* TLS +GLOBAL +DEFAULT +UND sG6
+.* FUNC +GLOBAL +DEFAULT +1 fn2
+.* TLS +GLOBAL +DEFAULT +7 sg2
+.* TLS +GLOBAL +DEFAULT +UND sG1
+.* TLS +GLOBAL +HIDDEN +7 sh1
+.* TLS +GLOBAL +DEFAULT +7 sg6
+.* TLS +GLOBAL +DEFAULT +7 sg7
+.* NOTYPE +GLOBAL +DEFAULT +11 _edata
+.* NOTYPE +GLOBAL +DEFAULT +11 _end
+.* TLS +GLOBAL +HIDDEN +7 sh2
+.* TLS +GLOBAL +HIDDEN +7 sh6
+.* TLS +GLOBAL +DEFAULT +8 bg2
+.* TLS +GLOBAL +DEFAULT +8 bg1
+.* TLS +GLOBAL +DEFAULT +8 bg4
diff --git a/ld/testsuite/ld-x86-64/tlsbin2.dd b/ld/testsuite/ld-x86-64/tlsbin2.dd
new file mode 100644
index 0000000..a73fcef
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbin2.dd
@@ -0,0 +1,310 @@
+#source: tlsbinpic2.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -drj.text
+#target: x86_64-*-*
+
+# PT_TLS layout is:
+# Offset from Offset from Name
+# TCB base TCB end
+# 0x00 -0xa0 sg1..sg8
+# 0x20 -0x80 sl1..sl8
+# 0x40 -0x60 sh1..sh8
+# 0x60 -0x40 bg1..bg8
+# 0x80 -0x20 bl1..bl8
+
+.*: +file format elf64-x86-64.*
+
+Disassembly of section .text:
+
+[0-9a-f]+ <fn2>:
+ +[0-9a-f]+: 55[ ]+push %rbp
+ +[0-9a-f]+: 48 89 e5[ ]+mov %rsp,%rbp
+# GD -> IE because variable is not defined in executable
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 sG1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# GD -> IE because variable is not defined in executable where
+# the variable is referenced through IE too
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x108>
+# -> R_X86_64_TPOFF64 sG2
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# GD -> LE with global variable defined in executable
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 48 8d 80 60 ff ff ff[ ]+lea -0xa0\(%rax\),%rax
+# sg1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# GD -> LE with local variable defined in executable
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 48 8d 80 80 ff ff ff[ ]+lea -0x80\(%rax\),%rax
+# sl1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# GD -> LE with hidden variable defined in executable
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 48 8d 80 a0 ff ff ff[ ]+lea -0x60\(%rax\),%rax
+# sh1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LD -> LE
+ +[0-9a-f]+: 66 66 66 66 64 48 8b[ ]+data16 data16 data16 data16 mov %fs:0x0,%rax
+ +[0-9a-f]+: 04 25 00 00 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 90 81 ff ff ff[ ]+lea -0x7f\(%rax\),%rdx
+# sl1+1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 4c 8d 88 86 ff ff ff[ ]+lea -0x7a\(%rax\),%r9
+# sl2+2
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LD -> LE against hidden variables
+ +[0-9a-f]+: 66 66 66 66 64 48 8b[ ]+data16 data16 data16 data16 mov %fs:0x0,%rax
+ +[0-9a-f]+: 04 25 00 00 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 90 a0 ff ff ff[ ]+lea -0x60\(%rax\),%rdx
+# sh1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 88 a7 ff ff ff[ ]+lea -0x59\(%rax\),%rcx
+# sh2+3
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE against global var
+ +[0-9a-f]+: 64 4c 8b 0c 25 00 00[ ]+mov %fs:0x0,%r9
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 4c 03 0d ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%r9 +# [0-9a-f]+ <_DYNAMIC\+0x108>
+# -> R_X86_64_TPOFF64 sG2
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against global var defined in exec
+ +[0-9a-f]+: 64 4c 8b 14 25 00 00[ ]+mov %fs:0x0,%r10
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 4d 8d 92 60 ff ff ff[ ]+lea -0xa0\(%r10\),%r10
+# sg1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against local var
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 80 80 ff ff ff[ ]+lea -0x80\(%rax\),%rax
+# sl1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against hidden var
+ +[0-9a-f]+: 64 48 8b 0c 25 00 00[ ]+mov %fs:0x0,%rcx
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 89 a0 ff ff ff[ ]+lea -0x60\(%rcx\),%rcx
+# sh1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# Direct access through %fs
+# IE against global var
+ +[0-9a-f]+: 48 8b 0d ([0-9a-f]{2} ){4}[ ]+mov 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x100>
+# -> R_X86_64_TPOFF64 sG5
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 48 8b 11[ ]+mov %fs:\(%rcx\),%rdx
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE->LE against local var
+ +[0-9a-f]+: 49 c7 c3 90 ff ff ff[ ]+mov \$0xf+90,%r11
+# sl5
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 4d 8b 23[ ]+mov %fs:\(%r11\),%r12
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE->LE against hidden var
+ +[0-9a-f]+: 48 c7 c2 b0 ff ff ff[ ]+mov \$0xf+b0,%rdx
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 48 8b 12[ ]+mov %fs:\(%rdx\),%rdx
+# sh5
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: c9[ ]+leaveq *
+ +[0-9a-f]+: c3[ ]+retq *
+
+[0-9a-f]+ <_start>:
+ +[0-9a-f]+: 55[ ]+push %rbp
+ +[0-9a-f]+: 48 89 e5[ ]+mov %rsp,%rbp
+# IE against global var
+ +[0-9a-f]+: 64 4c 8b 1c 25 00 00[ ]+mov %fs:0x0,%r11
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 4c 03 1d ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%r11 +# [0-9a-f]+ <_DYNAMIC\+0x118>
+# -> R_X86_64_TPOFF64 sG6
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against global var defined in exec
+ +[0-9a-f]+: 64 48 8b 14 25 00 00[ ]+mov %fs:0x0,%rdx
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 92 d4 ff ff ff[ ]+lea -0x2c\(%rdx\),%rdx
+# bg6
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against local var
+ +[0-9a-f]+: 64 4c 8b 24 25 00 00[ ]+mov %fs:0x0,%r12
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 49 81 c4 f4 ff ff ff[ ]+add \$0xf+f4,%r12
+# bl6
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# direct %fs access IE -> LE against local var
+ +[0-9a-f]+: 48 c7 c2 fc ff ff ff[ ]+mov \$0xf+fc,%rdx
+# bl8
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 48 8b 02[ ]+mov %fs:\(%rdx\),%rax
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# IE -> LE against hidden but not local var
+ +[0-9a-f]+: 64 48 8b 14 25 00 00[ ]+mov %fs:0x0,%rdx
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 92 b4 ff ff ff[ ]+lea -0x4c\(%rdx\),%rdx
+# sh6
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# direct %fs access IE -> LE against hidden but not local var
+ +[0-9a-f]+: 48 c7 c2 bc ff ff ff[ ]+mov \$0xf+bc,%rdx
+# sh8
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 48 8b 02[ ]+mov %fs:\(%rdx\),%rax
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, global var defined in exec
+ +[0-9a-f]+: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 8d 90 64 ff ff ff[ ]+lea -0x9c\(%rax\),%rdx
+# sg2
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, local var, non-canonical sequence
+ +[0-9a-f]+: 49 c7 c1 e6 ff ff ff[ ]+mov \$0xf+e6,%r9
+# bl2+2
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 64 48 8b 14 25 00 00[ ]+mov %fs:0x0,%rdx
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 4c 01 ca[ ]+add %r9,%rdx
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, hidden var defined in exec, non-canonical sequence
+ +[0-9a-f]+: 64 48 8b 14 25 00 00[ ]+mov %fs:0x0,%rdx
+ +[0-9a-f]+: 00 00 *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 48 81 c2 a5 ff ff ff[ ]+add \$0xf+a5,%rdx
+# sh2+1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# Direct %fs access
+# LE, global var defined in exec
+ +[0-9a-f]+: 64 48 8b 04 25 68 ff[ ]+mov %fs:0xf+68,%rax
+ +[0-9a-f]+: ff ff *
+# sg3
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, local var
+ +[0-9a-f]+: 64 4c 8b 14 25 eb ff[ ]+mov %fs:0xf+eb,%r10
+ +[0-9a-f]+: ff ff *
+# bl3+3
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, hidden var defined in exec
+ +[0-9a-f]+: 64 48 8b 14 25 a9 ff[ ]+mov %fs:0xf+a9,%rdx
+ +[0-9a-f]+: ff ff *
+# sh3+1
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+ +[0-9a-f]+: 90[ ]+nop *
+# LE, large model
+ +[0-9a-f]+: 48 ba a5 ff ff ff ff[ ]+movabs \$0xffffffffffffffa5,%rdx
+ +[0-9a-f]+: ff ff ff *
+ +[0-9a-f]+: c9[ ]+leaveq *
+ +[0-9a-f]+: c3[ ]+retq *
diff --git a/ld/testsuite/ld-x86-64/tlsbin2.rd b/ld/testsuite/ld-x86-64/tlsbin2.rd
new file mode 100644
index 0000000..b283648
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbin2.rd
@@ -0,0 +1,141 @@
+#source: tlsbinpic2.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#readelf: -WSsrl
+#target: x86_64-*-*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .interp +.*
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .text +PROGBITS +0+401000 0+1000 0+233 00 +AX +0 +0 +4096
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+601233 0+1233 0+60 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .tbss +NOBITS +0+601293 0+1293 0+40 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+601298 0+1298 0+100 10 +WA +4 +0 +8
+ +\[[ 0-9]+\] .got +PROGBITS +0+601398 0+1398 0+28 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+6013c0 0+13c0 0+18 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+#...
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x40113b
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +PHDR.*
+ +INTERP.*
+.*Requesting program interpreter.*
+ +LOAD +0x0+ 0x0+400000 0x0+400000 0x0+1233 0x0+1233 R E 0x200000
+ +LOAD +0x0+1233 0x0+601233 0x0+601233 0x0+1a5 0x0+1a5 RW +0x200000
+ +DYNAMIC +0x0+1298 0x0+601298 0x0+601298 0x0+100 0x0+100 RW +0x8
+ +TLS +0x0+1233 0x0+601233 0x0+601233 0x0+60 0x0+a0 R +0x1
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 *
+ +01 +.interp *
+ +02 +.interp .hash .dynsym .dynstr .rela.dyn .text *
+ +03 +.tdata .dynamic .got .got.plt *
+ +04 +.dynamic *
+ +05 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 5 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG5 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG2 \+ 0
+[0-9a-f ]+R_X86_64_GLOB_DAT +0+ __tls_get_addr \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG6 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+ sG1 \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* TLS +GLOBAL +DEFAULT +UND sG5
+.* TLS +GLOBAL +DEFAULT +UND sG2
+.* FUNC +GLOBAL +DEFAULT +UND __tls_get_addr
+.* NOTYPE +GLOBAL +DEFAULT +11 __bss_start
+.* TLS +GLOBAL +DEFAULT +UND sG6
+.* TLS +GLOBAL +DEFAULT +UND sG1
+.* NOTYPE +GLOBAL +DEFAULT +11 _edata
+.* NOTYPE +GLOBAL +DEFAULT +11 _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* SECTION +LOCAL +DEFAULT +1 *
+.* SECTION +LOCAL +DEFAULT +2 *
+.* SECTION +LOCAL +DEFAULT +3 *
+.* SECTION +LOCAL +DEFAULT +4 *
+.* SECTION +LOCAL +DEFAULT +5 *
+.* SECTION +LOCAL +DEFAULT +6 *
+.* SECTION +LOCAL +DEFAULT +7 *
+.* SECTION +LOCAL +DEFAULT +8 *
+.* SECTION +LOCAL +DEFAULT +9 *
+.* SECTION +LOCAL +DEFAULT +10 *
+.* SECTION +LOCAL +DEFAULT +11 *
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlsbinpic2.o
+.* TLS +LOCAL +DEFAULT +7 sl1
+.* TLS +LOCAL +DEFAULT +7 sl2
+.* TLS +LOCAL +DEFAULT +7 sl3
+.* TLS +LOCAL +DEFAULT +7 sl4
+.* TLS +LOCAL +DEFAULT +7 sl5
+.* TLS +LOCAL +DEFAULT +7 sl6
+.* TLS +LOCAL +DEFAULT +7 sl7
+.* TLS +LOCAL +DEFAULT +7 sl8
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlsbin.o
+.* TLS +LOCAL +DEFAULT +8 bl1
+.* TLS +LOCAL +DEFAULT +8 bl2
+.* TLS +LOCAL +DEFAULT +8 bl3
+.* TLS +LOCAL +DEFAULT +8 bl4
+.* TLS +LOCAL +DEFAULT +8 bl5
+.* TLS +LOCAL +DEFAULT +8 bl6
+.* TLS +LOCAL +DEFAULT +8 bl7
+.* TLS +LOCAL +DEFAULT +8 bl8
+.* FILE +LOCAL +DEFAULT +ABS
+.* OBJECT +LOCAL +DEFAULT +9 _DYNAMIC
+.* OBJECT +LOCAL +DEFAULT +11 _GLOBAL_OFFSET_TABLE_
+.* TLS +GLOBAL +DEFAULT +7 sg8
+.* TLS +GLOBAL +DEFAULT +8 bg8
+.* TLS +GLOBAL +DEFAULT +8 bg6
+.* TLS +GLOBAL +DEFAULT +UND sG5
+.* TLS +GLOBAL +DEFAULT +8 bg3
+.* TLS +GLOBAL +DEFAULT +7 sg3
+.* TLS +GLOBAL +HIDDEN +7 sh3
+.* TLS +GLOBAL +DEFAULT +UND sG2
+.* TLS +GLOBAL +DEFAULT +7 sg4
+.* TLS +GLOBAL +DEFAULT +7 sg5
+.* TLS +GLOBAL +DEFAULT +8 bg5
+.* FUNC +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +HIDDEN +7 sh7
+.* TLS +GLOBAL +HIDDEN +7 sh8
+.* TLS +GLOBAL +DEFAULT +7 sg1
+.* FUNC +GLOBAL +DEFAULT +6 _start
+.* TLS +GLOBAL +HIDDEN +7 sh4
+.* TLS +GLOBAL +DEFAULT +8 bg7
+.* TLS +GLOBAL +HIDDEN +7 sh5
+.* NOTYPE +GLOBAL +DEFAULT +11 __bss_start
+.* TLS +GLOBAL +DEFAULT +UND sG6
+.* FUNC +GLOBAL +DEFAULT +6 fn2
+.* TLS +GLOBAL +DEFAULT +7 sg2
+.* TLS +GLOBAL +DEFAULT +UND sG1
+.* TLS +GLOBAL +HIDDEN +7 sh1
+.* TLS +GLOBAL +DEFAULT +7 sg6
+.* TLS +GLOBAL +DEFAULT +7 sg7
+.* NOTYPE +GLOBAL +DEFAULT +11 _edata
+.* NOTYPE +GLOBAL +DEFAULT +11 _end
+.* TLS +GLOBAL +HIDDEN +7 sh2
+.* TLS +GLOBAL +HIDDEN +7 sh6
+.* TLS +GLOBAL +DEFAULT +8 bg2
+.* TLS +GLOBAL +DEFAULT +8 bg1
+.* TLS +GLOBAL +DEFAULT +8 bg4
diff --git a/ld/testsuite/ld-x86-64/tlsbin2.sd b/ld/testsuite/ld-x86-64/tlsbin2.sd
new file mode 100644
index 0000000..824500d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbin2.sd
@@ -0,0 +1,13 @@
+#source: tlsbinpic2.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -sj.got
+#target: x86_64-*-*
+
+.*: +file format elf64-x86-64.*
+
+Contents of section .got:
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 +.*
diff --git a/ld/testsuite/ld-x86-64/tlsbin2.td b/ld/testsuite/ld-x86-64/tlsbin2.td
new file mode 100644
index 0000000..ffe2ed4
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbin2.td
@@ -0,0 +1,16 @@
+#source: tlsbinpic2.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -sj.tdata
+#target: x86_64-*-*
+
+.*: +file format elf64-x86-64.*
+
+Contents of section .tdata:
+ [0-9a-f]+ 11000000 12000000 13000000 14000000 .*
+ [0-9a-f]+ 15000000 16000000 17000000 18000000 .*
+ [0-9a-f]+ 41000000 42000000 43000000 44000000 .*
+ [0-9a-f]+ 45000000 46000000 47000000 48000000 .*
+ [0-9a-f]+ 01010000 02010000 03010000 04010000 .*
+ [0-9a-f]+ 05010000 06010000 07010000 08010000 .*
diff --git a/ld/testsuite/ld-x86-64/tlsbinpic2.s b/ld/testsuite/ld-x86-64/tlsbinpic2.s
new file mode 100644
index 0000000..830fb2e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsbinpic2.s
@@ -0,0 +1,146 @@
+ /* Force .data aligned to 4K, so that .got very likely gets at
+ 0x5021a0 (0x60 bytes .tdata and 0x140 bytes .dynamic) */
+ .data
+ .balign 4096
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ /* Force .text aligned to 4K, so it very likely gets at 0x401000. */
+ .text
+ .balign 4096
+ .globl fn2
+ .type fn2,@function
+fn2:
+ pushq %rbp
+ movq %rsp, %rbp
+
+ /* GD -> IE because variable is not defined in executable */
+ .byte 0x66
+ leaq sG1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ .byte 0x66
+ leaq sG2@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> LE with global variable defined in executable */
+ .byte 0x66
+ leaq sg1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> LE with local variable defined in executable */
+ .byte 0x66
+ leaq sl1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> LE with hidden variable defined in executable */
+ .byte 0x66
+ leaq sh1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* LD -> LE */
+ leaq sl1@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop
+ leaq 1+sl1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq sl2@dtpoff+2(%rax), %r9
+ nop;nop;nop;nop
+
+ /* LD -> LE against hidden variables */
+ leaq sh1@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop
+ leaq sh1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq 3+sh2@dtpoff(%rax), %rcx
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ movq %fs:0, %r9
+ nop;nop
+ addq sG2@gottpoff(%rip), %r9
+ nop;nop;nop;nop
+
+ /* IE -> LE against global var defined in exec */
+ movq %fs:0, %r10
+ nop;nop
+ addq sg1@gottpoff(%rip), %r10
+ nop;nop;nop;nop
+
+ /* IE -> LE against local var */
+ movq %fs:0, %rax
+ nop;nop
+ addq sl1@gottpoff(%rip), %rax
+ nop;nop;nop;nop
+
+ /* IE -> LE against hidden var */
+ movq %fs:0, %rcx
+ nop;nop
+ addq sh1@gottpoff(%rip), %rcx
+ nop;nop;nop;nop
+
+ /* Direct access through %fs */
+
+ /* IE against global var */
+ movq sG5@gottpoff(%rip), %rcx
+ nop;nop
+ movq %fs:(%rcx), %rdx
+ nop;nop;nop;nop
+
+ /* IE->LE against local var */
+ movq sl5@gottpoff(%rip), %r11
+ nop;nop
+ movq %fs:(%r11), %r12
+ nop;nop;nop;nop
+
+ /* IE->LE against hidden var */
+ movq sh5@gottpoff(%rip), %rdx
+ nop;nop
+ movq %fs:(%rdx), %rdx
+ nop;nop;nop;nop
+
+ leave
+ ret
diff --git a/ld/testsuite/ld-x86-64/tlsgd10.dd b/ld/testsuite/ld-x86-64/tlsgd10.dd
new file mode 100644
index 0000000..448015e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd10.dd
@@ -0,0 +1,23 @@
+#source: tlsgd10.s
+#as: --64
+#ld: -melf_x86_64 tmpdir/tlsgd10
+#objdump: -drwj.text
+#target: x86_64-*-linux* x86_64-*-nacl*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 49 bb ([0-9a-f]{2} ){8} movabs \$0x[0-9a-f]+,%r11
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 4c 8d 3d eb ff ff ff lea -0x15\(%rip\),%r15 # [0-9a-f]+ <_start>
+[ ]*[a-f0-9]+: 4d 01 df add %r11,%r15
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 48 03 05 ([0-9a-f]{2} ){4} add 0x[0-9a-f]+\(%rip\),%rax # [0-9a-f]+ <_DYNAMIC\+0x140>
+[ ]*[a-f0-9]+: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\)
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: c3 retq
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd10.s b/ld/testsuite/ld-x86-64/tlsgd10.s
new file mode 100644
index 0000000..5bb9823
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd10.s
@@ -0,0 +1,18 @@
+ .text
+ .globl _start
+_start:
+1: movabsq $_GLOBAL_OFFSET_TABLE_-1b, %r11
+ pushq %r15
+ pushq %r15
+ leaq 1b(%rip), %r15
+ addq %r11, %r15
+
+ /* GD, -mcmodel=large */
+ leaq foo@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+
+ popq %r15
+ popq %r15
+ ret
diff --git a/ld/testsuite/ld-x86-64/tlsgd11.dd b/ld/testsuite/ld-x86-64/tlsgd11.dd
new file mode 100644
index 0000000..b4f3c99
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd11.dd
@@ -0,0 +1,14 @@
+#source: tlsgd1.s
+#as: --64
+#ld: -melf_x86_64 tmpdir/tlsgd1
+#objdump: -drw
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 48 8d 80 fc ff ff ff lea -0x4\(%rax\),%rax
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd11.s b/ld/testsuite/ld-x86-64/tlsgd11.s
new file mode 100644
index 0000000..e5f52ed
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd11.s
@@ -0,0 +1,15 @@
+ .text
+ .globl _start
+_start:
+ .byte 0x66
+ leaq foo@TLSGD(%rip), %rdi
+ .word 0x6666
+ rex64
+ call __tls_get_addr
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsgd12.d b/ld/testsuite/ld-x86-64/tlsgd12.d
new file mode 100644
index 0000000..0c235ce
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd12.d
@@ -0,0 +1,4 @@
+#name: TLS GD->IE transition check without PLT
+#as: --64
+#ld: -melf_x86_64
+#error: .*TLS transition from R_X86_64_TLSGD to R_X86_64_GOTTPOFF against `foo'.*failed.*
diff --git a/ld/testsuite/ld-x86-64/tlsgd12.s b/ld/testsuite/ld-x86-64/tlsgd12.s
new file mode 100644
index 0000000..f583c85
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd12.s
@@ -0,0 +1,5 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSGD(%rip), %rdi
+ call __tls_get_addr
diff --git a/ld/testsuite/ld-x86-64/tlsgd13.d b/ld/testsuite/ld-x86-64/tlsgd13.d
new file mode 100644
index 0000000..d09bd65
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd13.d
@@ -0,0 +1,4 @@
+#name: TLS GD->LE transition check without PLT
+#as: --64
+#ld: -melf_x86_64
+#error: .*TLS transition from R_X86_64_TLSGD to R_X86_64_TPOFF32 against `foo'.*failed.*
diff --git a/ld/testsuite/ld-x86-64/tlsgd13.s b/ld/testsuite/ld-x86-64/tlsgd13.s
new file mode 100644
index 0000000..e1e7e60
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd13.s
@@ -0,0 +1,11 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSGD(%rip), %rdi
+ call __tls_get_addr
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsgd14.dd b/ld/testsuite/ld-x86-64/tlsgd14.dd
new file mode 100644
index 0000000..b8a99c8
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd14.dd
@@ -0,0 +1,10 @@
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 64 8b 04 25 00 00 00 00 mov %fs:0x0,%eax
+[ ]*[a-f0-9]+: 48 8d 80 fc ff ff ff lea -0x4\(%rax\),%rax
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd14.s b/ld/testsuite/ld-x86-64/tlsgd14.s
new file mode 100644
index 0000000..037ce25
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd14.s
@@ -0,0 +1,14 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSGD(%rip), %rdi
+ .word 0x6666
+ rex64
+ call __tls_get_addr
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsgd5.dd b/ld/testsuite/ld-x86-64/tlsgd5.dd
index 64ad1cd..54cf357 100644
--- a/ld/testsuite/ld-x86-64/tlsgd5.dd
+++ b/ld/testsuite/ld-x86-64/tlsgd5.dd
@@ -10,5 +10,5 @@ Disassembly of section .text:
[a-f0-9]+ <_start>:
[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
-[ ]*[a-f0-9]+: 48 03 05 ([0-9a-f]{2} ){4} * add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x100>
+[ ]*[a-f0-9]+: 48 03 05 ([0-9a-f]{2} ){4} * add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[a-f0-9]+>
#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd5c.s b/ld/testsuite/ld-x86-64/tlsgd5c.s
new file mode 100644
index 0000000..1f093c8
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd5c.s
@@ -0,0 +1,8 @@
+ .text
+ .globl _start
+_start:
+ .byte 0x66
+ leaq foo@TLSGD(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
diff --git a/ld/testsuite/ld-x86-64/tlsgd6.dd b/ld/testsuite/ld-x86-64/tlsgd6.dd
index 146fbc4..2cbfda6 100644
--- a/ld/testsuite/ld-x86-64/tlsgd6.dd
+++ b/ld/testsuite/ld-x86-64/tlsgd6.dd
@@ -10,5 +10,5 @@ Disassembly of section .text:
[a-f0-9]+ <_start>:
[ ]*[a-f0-9]+: 64 8b 04 25 00 00 00 00 mov %fs:0x0,%eax
-[ ]*[a-f0-9]+: 48 03 05 ([0-9a-f]{2} ){4} * add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x80>
+[ ]*[a-f0-9]+: 48 03 05 ([0-9a-f]{2} ){4} * add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[a-f0-9]+>
#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd6c.s b/ld/testsuite/ld-x86-64/tlsgd6c.s
new file mode 100644
index 0000000..4aa9ef6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd6c.s
@@ -0,0 +1,7 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSGD(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
diff --git a/ld/testsuite/ld-x86-64/tlsgd9.dd b/ld/testsuite/ld-x86-64/tlsgd9.dd
new file mode 100644
index 0000000..ebfdf83
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd9.dd
@@ -0,0 +1,23 @@
+#source: tlsgd9.s
+#as: --64
+#ld: -melf_x86_64 tmpdir/tlsgd9
+#objdump: -drw
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 49 bb ([0-9a-f]{2} ){8} movabs \$0x[0-9a-f]+,%r11
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 4c 8d 3d eb ff ff ff lea -0x15\(%rip\),%r15 # [0-9a-f]+ <_start>
+[ ]*[a-f0-9]+: 4d 01 df add %r11,%r15
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 48 8d 80 fc ff ff ff lea -0x4\(%rax\),%rax
+[ ]*[a-f0-9]+: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\)
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: c3 retq
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsgd9.s b/ld/testsuite/ld-x86-64/tlsgd9.s
new file mode 100644
index 0000000..11ce109
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsgd9.s
@@ -0,0 +1,25 @@
+ .text
+ .globl _start
+_start:
+1: movabsq $_GLOBAL_OFFSET_TABLE_-1b, %r11
+ pushq %r15
+ pushq %r15
+ leaq 1b(%rip), %r15
+ addq %r11, %r15
+
+ /* GD, -mcmodel=large */
+ leaq foo@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+
+ popq %r15
+ popq %r15
+ ret
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsld4.dd b/ld/testsuite/ld-x86-64/tlsld4.dd
new file mode 100644
index 0000000..0121cc4
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld4.dd
@@ -0,0 +1,23 @@
+#source: tlsld4.s
+#as: --64
+#ld: -melf_x86_64 tmpdir/tlsld4
+#objdump: -drw
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 49 bb ([0-9a-f]{2} ){8} movabs \$0x[0-9a-f]+,%r11
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 41 57 push %r15
+[ ]*[a-f0-9]+: 4c 8d 3d eb ff ff ff lea -0x15\(%rip\),%r15 # [0-9a-f]+ <_start>
+[ ]*[a-f0-9]+: 4d 01 df add %r11,%r15
+[ ]*[a-f0-9]+: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 data16 data16 data16 nopw %cs:0x0\(%rax,%rax,1\)
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 8b 80 fc ff ff ff mov -0x4\(%rax\),%eax
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: 41 5f pop %r15
+[ ]*[a-f0-9]+: c3 retq
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsld4.s b/ld/testsuite/ld-x86-64/tlsld4.s
new file mode 100644
index 0000000..71fe9f2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld4.s
@@ -0,0 +1,27 @@
+ .text
+ .globl _start
+_start:
+1: movabsq $_GLOBAL_OFFSET_TABLE_-1b, %r11
+ pushq %r15
+ pushq %r15
+ leaq 1b(%rip), %r15
+ addq %r11, %r15
+
+ /* LD, -mcmodel=large */
+ leaq foo@tlsld(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+
+ movl foo@dtpoff(%rax), %eax
+
+ popq %r15
+ popq %r15
+ ret
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsld5.dd b/ld/testsuite/ld-x86-64/tlsld5.dd
new file mode 100644
index 0000000..600fc83
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld5.dd
@@ -0,0 +1,13 @@
+#source: tlsld1.s
+#as: --64
+#ld: -melf_x86_64 tmpdir/tlsld1
+#objdump: -drw
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 66 66 66 66 64 48 8b 04 25 00 00 00 00 data16 data16 data16 data16 mov %fs:0x0,%rax
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsld5.s b/ld/testsuite/ld-x86-64/tlsld5.s
new file mode 100644
index 0000000..279fde5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld5.s
@@ -0,0 +1,12 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSLD(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlsld6.dd b/ld/testsuite/ld-x86-64/tlsld6.dd
new file mode 100644
index 0000000..14aa312
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld6.dd
@@ -0,0 +1,14 @@
+#source: tlsld2.s
+#as: --x32
+#ld: -melf32_x86_64 tmpdir/tlsld2
+#objdump: -drw
+#target: x86_64-*-linux*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 66 0f 1f 40 00 nopw 0x0\(%rax\)
+[ ]*[a-f0-9]+: 64 8b 04 25 00 00 00 00 mov %fs:0x0,%eax
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlsld6.s b/ld/testsuite/ld-x86-64/tlsld6.s
new file mode 100644
index 0000000..279fde5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlsld6.s
@@ -0,0 +1,12 @@
+ .text
+ .globl _start
+_start:
+ leaq foo@TLSLD(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ .globl foo
+ .section .tdata,"awT",@progbits
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 100
diff --git a/ld/testsuite/ld-x86-64/tlspic2-nacl.rd b/ld/testsuite/ld-x86-64/tlspic2-nacl.rd
new file mode 100644
index 0000000..1919b3f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic2-nacl.rd
@@ -0,0 +1,145 @@
+#source: tlspic3.s
+#source: tlspic2.s
+#as: --64
+#ld: -shared -melf_x86_64_nacl --no-ld-generated-unwind-info
+#readelf: -WSsrl
+#target: x86_64-*-nacl*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .plt +.*
+ +\[[ 0-9]+\] .text +PROGBITS +0+1000 [0-9a-f]+ 0+31a 00 +AX +0 +0 4096
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .rela.plt +.*
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+100104c8 [0-9a-f]+ 0+60 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .tbss +NOBITS +0+10010528 [0-9a-f]+ 0+20 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+10010528 [0-9a-f]+ 0+130 10 +WA +5 +0 +8
+ +\[[ 0-9]+\] .got +PROGBITS +0+10010658 [0-9a-f]+ 0+98 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+100106f0 [0-9a-f]+ 0+20 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+#...
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x1000
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +LOAD +0x0+10000 0x0+ 0x0+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x10000
+ +LOAD +0x0+ 0x0+10000000 0x0+10000000 0x0+4c8 0x0+4c8 R +0x10000
+ +LOAD +0x0+4c8 0x0+100104c8 0x0+100104c8 0x0+248 0x0+248 RW +0x10000
+ +DYNAMIC +0x0+528 0x0+10010528 0x0+10010528 0x0+130 0x0+130 RW +0x8
+ +TLS +0x0+4c8 0x0+100104c8 0x0+100104c8 0x0+60 0x0+80 R +0x1
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 +.plt .text *
+ +01 +.hash .dynsym .dynstr .rela.dyn .rela.plt *
+ +02 +.tdata .dynamic .got .got.plt *
+ +03 +.dynamic *
+ +04 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 15 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +24
+[0-9a-f ]+R_X86_64_TPOFF64 +30
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +64
+[0-9a-f ]+R_X86_64_TPOFF64 +50
+[0-9a-f ]+R_X86_64_TPOFF64 +70
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +44
+[0-9a-f ]+R_X86_64_TPOFF64 +0+10 sg5 \+ 0
+[0-9a-f ]+R_X86_64_GLOB_DAT +0+ __tls_get_addr \+ 0
+[0-9a-f ]+R_X86_64_DTPMOD64 +0+ sg1 \+ 0
+[0-9a-f ]+R_X86_64_DTPOFF64 +0+ sg1 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+4 sg2 \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f ]+R_X86_64_JUMP_SLOT +0+ __tls_get_addr \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* TLS +GLOBAL +DEFAULT +8 sg8
+.* TLS +GLOBAL +DEFAULT +8 sg3
+.* TLS +GLOBAL +DEFAULT +8 sg4
+.* TLS +GLOBAL +DEFAULT +8 sg5
+.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +DEFAULT +8 sg1
+.* FUNC +GLOBAL +DEFAULT +2 fn1
+.* NOTYPE +GLOBAL +DEFAULT +12 __bss_start
+.* TLS +GLOBAL +DEFAULT +8 sg2
+.* TLS +GLOBAL +DEFAULT +8 sg6
+.* TLS +GLOBAL +DEFAULT +8 sg7
+.* NOTYPE +GLOBAL +DEFAULT +12 _edata
+.* NOTYPE +GLOBAL +DEFAULT +12 _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* SECTION +LOCAL +DEFAULT +1 *
+.* SECTION +LOCAL +DEFAULT +2 *
+.* SECTION +LOCAL +DEFAULT +3 *
+.* SECTION +LOCAL +DEFAULT +4 *
+.* SECTION +LOCAL +DEFAULT +5 *
+.* SECTION +LOCAL +DEFAULT +6 *
+.* SECTION +LOCAL +DEFAULT +7 *
+.* SECTION +LOCAL +DEFAULT +8 *
+.* SECTION +LOCAL +DEFAULT +9 *
+.* SECTION +LOCAL +DEFAULT +10 *
+.* SECTION +LOCAL +DEFAULT +11 *
+.* SECTION +LOCAL +DEFAULT +12 *
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlspic3.o
+.* TLS +LOCAL +DEFAULT +8 sl1
+.* TLS +LOCAL +DEFAULT +8 sl2
+.* TLS +LOCAL +DEFAULT +8 sl3
+.* TLS +LOCAL +DEFAULT +8 sl4
+.* TLS +LOCAL +DEFAULT +8 sl5
+.* TLS +LOCAL +DEFAULT +8 sl6
+.* TLS +LOCAL +DEFAULT +8 sl7
+.* TLS +LOCAL +DEFAULT +8 sl8
+.* FILE +LOCAL +DEFAULT +ABS
+.* TLS +LOCAL +DEFAULT +9 sH1
+.* OBJECT +LOCAL +DEFAULT +10 _DYNAMIC
+.* TLS +LOCAL +DEFAULT +8 sh3
+.* TLS +LOCAL +DEFAULT +9 sH2
+.* TLS +LOCAL +DEFAULT +9 sH7
+.* TLS +LOCAL +DEFAULT +8 sh7
+.* TLS +LOCAL +DEFAULT +8 sh8
+.* TLS +LOCAL +DEFAULT +9 sH4
+.* TLS +LOCAL +DEFAULT +8 sh4
+.* TLS +LOCAL +DEFAULT +9 sH3
+.* TLS +LOCAL +DEFAULT +8 sh5
+.* TLS +LOCAL +DEFAULT +9 sH5
+.* TLS +LOCAL +DEFAULT +9 sH6
+.* TLS +LOCAL +DEFAULT +9 sH8
+.* TLS +LOCAL +DEFAULT +8 sh1
+.* OBJECT +LOCAL +DEFAULT +12 _GLOBAL_OFFSET_TABLE_
+.* TLS +LOCAL +DEFAULT +8 sh2
+.* TLS +LOCAL +DEFAULT +8 sh6
+.* TLS +GLOBAL +DEFAULT +8 sg8
+.* TLS +GLOBAL +DEFAULT +8 sg3
+.* TLS +GLOBAL +DEFAULT +8 sg4
+.* TLS +GLOBAL +DEFAULT +8 sg5
+.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +DEFAULT +8 sg1
+.* FUNC +GLOBAL +DEFAULT +2 fn1
+.* NOTYPE +GLOBAL +DEFAULT +12 __bss_start
+.* TLS +GLOBAL +DEFAULT +8 sg2
+.* TLS +GLOBAL +DEFAULT +8 sg6
+.* TLS +GLOBAL +DEFAULT +8 sg7
+.* NOTYPE +GLOBAL +DEFAULT +12 _edata
+.* NOTYPE +GLOBAL +DEFAULT +12 _end
diff --git a/ld/testsuite/ld-x86-64/tlspic2.dd b/ld/testsuite/ld-x86-64/tlspic2.dd
new file mode 100644
index 0000000..18358f1
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic2.dd
@@ -0,0 +1,378 @@
+#source: tlspic3.s
+#source: tlspic2.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -drj.text -Mintel64
+#target: x86_64-*-*
+
+.*: +file format elf64-x86-64.*
+
+Disassembly of section .text:
+
+0+1000 <fn1>:
+ +1000: 55[ ]+push %rbp
+ +1001: 48 89 e5[ ]+mov %rsp,%rbp
+ +1004: 90[ ]+nop *
+ +1005: 90[ ]+nop *
+ +1006: 90[ ]+nop *
+ +1007: 90[ ]+nop *
+# GD
+ +1008: 66 48 8d 3d ([0-9a-f]{2} ){3}[ ]+data16 lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+ +100f: [0-9a-f ]+
+# -> R_X86_64_DTPMOD64 sg1
+ +1010: 66 48 ff [0-9a-f ]+data16 rex\.W callq \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +1017: [0-9a-f ]+
+ +1018: 90[ ]+nop *
+ +1019: 90[ ]+nop *
+ +101a: 90[ ]+nop *
+ +101b: 90[ ]+nop *
+# GD -> IE because variable is referenced through IE too
+ +101c: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +1023: 00 00 *
+ +1025: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 sg2
+ +102c: 90[ ]+nop *
+ +102d: 90[ ]+nop *
+ +102e: 90[ ]+nop *
+ +102f: 90[ ]+nop *
+# GD against local variable
+ +1030: 66 48 8d 3d ([0-9a-f]{2} ){3}[ ]+data16 lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+ +1037: [0-9a-f ]+
+# -> R_X86_64_DTPMOD64 [0 0x2000000000000000]
+ +1038: 66 48 ff [0-9a-f ]+data16 rex\.W callq \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +103f: [0-9a-f ]+
+ +1040: 90[ ]+nop *
+ +1041: 90[ ]+nop *
+ +1042: 90[ ]+nop *
+ +1043: 90[ ]+nop *
+# GD -> IE against local variable referenced through IE too
+ +1044: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +104b: 00 00 *
+ +104d: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x24
+ +1054: 90[ ]+nop *
+ +1055: 90[ ]+nop *
+ +1056: 90[ ]+nop *
+ +1057: 90[ ]+nop *
+# GD against hidden and local variable
+ +1058: 66 48 8d 3d ([0-9a-f]{2} ){3}[ ]+data16 lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+ +105f: [0-9a-f ]+
+# -> R_X86_64_DTPMOD64 [0 0x4000000000000000]
+ +1060: 66 48 ff [0-9a-f ]+data16 rex\.W callq \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +1067: [0-9a-f ]+
+ +1068: 90[ ]+nop *
+ +1069: 90[ ]+nop *
+ +106a: 90[ ]+nop *
+ +106b: 90[ ]+nop *
+# GD -> IE against hidden and local variable referenced through IE too
+ +106c: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +1073: 00 00 *
+ +1075: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x44
+ +107c: 90[ ]+nop *
+ +107d: 90[ ]+nop *
+ +107e: 90[ ]+nop *
+ +107f: 90[ ]+nop *
+# GD against hidden but not local variable
+ +1080: 66 48 8d 3d ([0-9a-f]{2} ){3}[ ]+data16 lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+ +1087: [0-9a-f ]+
+# -> R_X86_64_DTPMOD64 [0 0x6000000000000000]
+ +1088: 66 48 ff [0-9a-f ]+data16 rex\.W callq \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +108f: [0-9a-f ]+
+ +1090: 90[ ]+nop *
+ +1091: 90[ ]+nop *
+ +1092: 90[ ]+nop *
+ +1093: 90[ ]+nop *
+# GD -> IE against hidden but not local variable referenced through IE too
+ +1094: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +109b: 00 00 *
+ +109d: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x64
+ +10a4: 90[ ]+nop *
+ +10a5: 90[ ]+nop *
+ +10a6: 90[ ]+nop *
+ +10a7: 90[ ]+nop *
+# LD
+ +10a8: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +10af: ff [0-9a-f ]+callq[ ]+\*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +10b5: 90[ ]+nop *
+ +10b6: 48 8d 90 20 00 00 00[ ]+lea 0x20\(%rax\),%rdx
+ +10bd: 90[ ]+nop *
+ +10be: 90[ ]+nop *
+ +10bf: 4c 8d 88 26 00 00 00[ ]+lea 0x26\(%rax\),%r9
+ +10c6: 90[ ]+nop *
+ +10c7: 90[ ]+nop *
+ +10c8: 90[ ]+nop *
+ +10c9: 90[ ]+nop *
+# LD against hidden and local variables
+ +10ca: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +10d1: ff [0-9a-f ]+callq[ ]+\*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +10d7: 90[ ]+nop *
+ +10d8: 48 8d 90 40 00 00 00[ ]+lea 0x40\(%rax\),%rdx
+ +10df: 90[ ]+nop *
+ +10e0: 90[ ]+nop *
+ +10e1: 48 8d 88 47 00 00 00[ ]+lea 0x47\(%rax\),%rcx
+ +10e8: 90[ ]+nop *
+ +10e9: 90[ ]+nop *
+ +10ea: 90[ ]+nop *
+ +10eb: 90[ ]+nop *
+# LD against hidden but not local variables
+ +10ec: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +10f3: ff [0-9a-f ]+callq[ ]+\*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +10f9: 90[ ]+nop *
+ +10fa: 4c 8d a0 60 00 00 00[ ]+lea 0x60\(%rax\),%r12
+ +1101: 90[ ]+nop *
+ +1102: 90[ ]+nop *
+ +1103: 48 8d 88 65 00 00 00[ ]+lea 0x65\(%rax\),%rcx
+ +110a: 90[ ]+nop *
+ +110b: 90[ ]+nop *
+# IE against global var
+ +110c: 64 48 8b 0c 25 00 00[ ]+mov %fs:0x0,%rcx
+ +1113: 00 00 *
+ +1115: 90[ ]+nop *
+ +1116: 90[ ]+nop *
+ +1117: 48 03 0d ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 sg2
+ +111e: 90[ ]+nop *
+ +111f: 90[ ]+nop *
+ +1120: 90[ ]+nop *
+ +1121: 90[ ]+nop *
+# IE against local var
+ +1122: 64 4c 8b 34 25 00 00[ ]+mov %fs:0x0,%r14
+ +1129: 00 00 *
+ +112b: 90[ ]+nop *
+ +112c: 90[ ]+nop *
+ +112d: 4c 03 35 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%r14 +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x24
+ +1134: 90[ ]+nop *
+ +1135: 90[ ]+nop *
+ +1136: 90[ ]+nop *
+ +1137: 90[ ]+nop *
+# IE against hidden and local var
+ +1138: 64 48 8b 0c 25 00 00[ ]+mov %fs:0x0,%rcx
+ +113f: 00 00 *
+ +1141: 90[ ]+nop *
+ +1142: 90[ ]+nop *
+ +1143: 48 03 0d ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x44
+ +114a: 90[ ]+nop *
+ +114b: 90[ ]+nop *
+ +114c: 90[ ]+nop *
+ +114d: 90[ ]+nop *
+# IE against hidden but not local var
+ +114e: 64 48 8b 0c 25 00 00[ ]+mov %fs:0x0,%rcx
+ +1155: 00 00 *
+ +1157: 90[ ]+nop *
+ +1158: 90[ ]+nop *
+ +1159: 48 03 0d ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x64
+ +1160: 90[ ]+nop *
+ +1161: 90[ ]+nop *
+ +1162: 90[ ]+nop *
+ +1163: 90[ ]+nop *
+# Direct access through %fs
+# IE against global var
+ +1164: 48 8b 0d ([0-9a-f]{2} ){4}[ ]+mov 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 sg5
+ +116b: 90[ ]+nop *
+ +116c: 90[ ]+nop *
+ +116d: 64 48 8b 11[ ]+mov %fs:\(%rcx\),%rdx
+ +1171: 90[ ]+nop *
+ +1172: 90[ ]+nop *
+ +1173: 90[ ]+nop *
+ +1174: 90[ ]+nop *
+# IE against local var
+ +1175: 4c 8b 15 ([0-9a-f]{2} ){4}[ ]+mov 0x[0-9a-f]+\(%rip\),%r10 +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x30
+ +117c: 90[ ]+nop *
+ +117d: 90[ ]+nop *
+ +117e: 64 4d 8b 22[ ]+mov %fs:\(%r10\),%r12
+ +1182: 90[ ]+nop *
+ +1183: 90[ ]+nop *
+ +1184: 90[ ]+nop *
+ +1185: 90[ ]+nop *
+# IE against hidden and local var
+ +1186: 48 8b 15 ([0-9a-f]{2} ){4}[ ]+mov 0x[0-9a-f]+\(%rip\),%rdx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x50
+ +118d: 90[ ]+nop *
+ +118e: 90[ ]+nop *
+ +118f: 64 48 8b 12[ ]+mov %fs:\(%rdx\),%rdx
+ +1193: 90[ ]+nop *
+ +1194: 90[ ]+nop *
+ +1195: 90[ ]+nop *
+ +1196: 90[ ]+nop *
+# IE against hidden but not local var
+ +1197: 48 8b 0d ([0-9a-f]{2} ){4}[ ]+mov 0x[0-9a-f]+\(%rip\),%rcx +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x70
+ +119e: 90[ ]+nop *
+ +119f: 90[ ]+nop *
+ +11a0: 64 48 8b 11[ ]+mov %fs:\(%rcx\),%rdx
+ +11a4: 90[ ]+nop *
+ +11a5: 90[ ]+nop *
+ +11a6: 90[ ]+nop *
+ +11a7: 90[ ]+nop *
+ +11a8: 49 bb ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%r11
+ +11af: ([0-9a-f]{2} ){3}
+ +11b2: 41 57[ ]+push %r15
+ +11b4: 41 57[ ]+push %r15
+ +11b6: 4c 8d 3d eb ff ff ff[ ]+lea -0x15\(%rip\),%r15 +# [0-9a-f]+ <fn1\+0x[0-9a-f]+>
+ +11bd: 4d 01 df[ ]+add %r11,%r15
+ +11c0: 90[ ]+nop *
+ +11c1: 90[ ]+nop *
+# -mcmodel=large sequences
+#
+# -mcmodel=large GD
+ +11c2: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 sg1
+ +11c9: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +11d0: ([0-9a-f]{2} ){3}
+ +11d3: 4c 01 f8[ ]+add %r15,%rax
+ +11d6: ff d0[ ]+callq \*%rax
+ +11d8: 90[ ]+nop *
+ +11d9: 90[ ]+nop *
+ +11da: 90[ ]+nop *
+ +11db: 90[ ]+nop *
+# -mcmodel=large GD -> IE because variable is referenced through IE too
+# -> R_X86_64_TPOFF64 sg2
+ +11dc: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +11e3: 00 00
+ +11e5: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 sg2
+ +11ec: 66 0f 1f 44 00 00[ ]+nopw 0x0\(%rax,%rax,1\)
+ +11f2: 90[ ]+nop *
+ +11f3: 90[ ]+nop *
+ +11f4: 90[ ]+nop *
+ +11f5: 90[ ]+nop *
+# -mcmodel=large GD against local variable
+ +11f6: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x2000000000000000]
+ +11fd: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +1204: ([0-9a-f]{2} ){3}
+ +1207: 4c 01 f8[ ]+add %r15,%rax
+ +120a: ff d0[ ]+callq \*%rax
+ +120c: 90[ ]+nop *
+ +120d: 90[ ]+nop *
+ +120e: 90[ ]+nop *
+ +120f: 90[ ]+nop *
+# -mcmodel=large GD -> IE against local variable referenced through IE too
+ +1210: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +1217: 00 00
+ +1219: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x24
+ +1220: 66 0f 1f 44 00 00[ ]+nopw 0x0\(%rax,%rax,1\)
+ +1226: 90[ ]+nop *
+ +1227: 90[ ]+nop *
+ +1228: 90[ ]+nop *
+ +1229: 90[ ]+nop *
+# -mcmodel=large GD against hidden and local variable
+ +122a: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x4000000000000000]
+ +1231: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +1238: ([0-9a-f]{2} ){3}
+ +123b: 4c 01 f8[ ]+add %r15,%rax
+ +123e: ff d0[ ]+callq \*%rax
+ +1240: 90[ ]+nop *
+ +1241: 90[ ]+nop *
+ +1242: 90[ ]+nop *
+ +1243: 90[ ]+nop *
+# -mcmodel=large GD -> IE against hidden and local variable referenced through IE too
+ +1244: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +124b: 00 00
+ +124d: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x44
+ +1254: 66 0f 1f 44 00 00[ ]+nopw 0x0\(%rax,%rax,1\)
+ +125a: 90[ ]+nop *
+ +125b: 90[ ]+nop *
+ +125c: 90[ ]+nop *
+ +125d: 90[ ]+nop *
+# -mcmodel=large GD against hidden but not local variable
+ +125e: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x6000000000000000]
+ +1265: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +126c: ([0-9a-f]{2} ){3}
+ +126f: 4c 01 f8[ ]+add %r15,%rax
+ +1272: ff d0[ ]+callq \*%rax
+ +1274: 90[ ]+nop *
+ +1275: 90[ ]+nop *
+ +1276: 90[ ]+nop *
+ +1277: 90[ ]+nop *
+# -mcmodel=large GD -> IE against hidden but not local variable referenced through IE too
+ +1278: 64 48 8b 04 25 00 00[ ]+mov %fs:0x0,%rax
+ +127f: 00 00
+ +1281: 48 03 05 ([0-9a-f]{2} ){4}[ ]+add 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_TPOFF64 *ABS*+0x64
+ +1288: 66 0f 1f 44 00 00[ ]+nopw 0x0\(%rax,%rax,1\)
+ +128e: 90[ ]+nop *
+ +128f: 90[ ]+nop *
+ +1290: 90[ ]+nop *
+ +1291: 90[ ]+nop *
+# -mcmodel=large LD
+ +1292: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +1299: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +12a0: ([0-9a-f]{2} ){3}
+ +12a3: 4c 01 f8[ ]+add %r15,%rax
+ +12a6: ff d0[ ]+callq \*%rax
+ +12a8: 90[ ]+nop *
+ +12a9: 90[ ]+nop *
+ +12aa: 48 8d 90 20 00 00 00[ ]+lea 0x20\(%rax\),%rdx
+ +12b1: 90[ ]+nop *
+ +12b2: 90[ ]+nop *
+ +12b3: 4c 8d 88 26 00 00 00[ ]+lea 0x26\(%rax\),%r9
+ +12ba: 90[ ]+nop *
+ +12bb: 90[ ]+nop *
+ +12bc: 90[ ]+nop *
+ +12bd: 90[ ]+nop *
+# -mcmodel=large LD against hidden and local variables
+ +12be: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +12c5: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +12cc: ([0-9a-f]{2} ){3}
+ +12cf: 4c 01 f8[ ]+add %r15,%rax
+ +12d2: ff d0[ ]+callq \*%rax
+ +12d4: 90[ ]+nop *
+ +12d5: 90[ ]+nop *
+ +12d6: 48 8d 90 40 00 00 00[ ]+lea 0x40\(%rax\),%rdx
+ +12dd: 90[ ]+nop *
+ +12de: 90[ ]+nop *
+ +12df: 48 8d 88 47 00 00 00[ ]+lea 0x47\(%rax\),%rcx
+ +12e6: 90[ ]+nop *
+ +12e7: 90[ ]+nop *
+ +12e8: 90[ ]+nop *
+ +12e9: 90[ ]+nop *
+# -mcmodel=large LD against hidden but not local variables
+ +12ea: 48 8d 3d ([0-9a-f]{2} ){4}[ ]+lea 0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x[0-9a-f]+>
+# -> R_X86_64_DTPMOD64 [0 0x000000000000000]
+ +12f1: 48 b8 ([0-9a-f]{2} ){5}[ ]+movabs \$0x[0-9a-f]+,%rax
+# -> R_X86_64_GLOB_DAT __tls_get_addr
+ +12f8: ([0-9a-f]{2} ){3}
+ +12fb: 4c 01 f8[ ]+add %r15,%rax
+ +12fe: ff d0[ ]+callq \*%rax
+ +1300: 90[ ]+nop *
+ +1301: 90[ ]+nop *
+ +1302: 4c 8d a0 60 00 00 00[ ]+lea 0x60\(%rax\),%r12
+ +1309: 90[ ]+nop *
+ +130a: 90[ ]+nop *
+ +130b: 48 8d 88 65 00 00 00[ ]+lea 0x65\(%rax\),%rcx
+ +1312: 90[ ]+nop *
+ +1313: 90[ ]+nop *
+ +1314: 41 5f[ ]+pop %r15
+ +1316: 41 5f[ ]+pop %r15
+ +1318: c9[ ]+leaveq
+ +1319: c3[ ]+retq
diff --git a/ld/testsuite/ld-x86-64/tlspic2.rd b/ld/testsuite/ld-x86-64/tlspic2.rd
new file mode 100644
index 0000000..3c7b8c1
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic2.rd
@@ -0,0 +1,139 @@
+#source: tlspic3.s
+#source: tlspic2.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#readelf: -WSsrl
+#target: x86_64-*-*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .plt +.*
+ +\[[ 0-9]+\] .plt.got +.*
+ +\[[ 0-9]+\] .text +PROGBITS +0+1000 0+1000 0+31a 00 +AX +0 +0 4096
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+20131a 0+131a 0+60 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .tbss +NOBITS +0+20137a 0+137a 0+20 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+201380 0+1380 0+100 10 +WA +3 +0 +8
+ +\[[ 0-9]+\] .got +PROGBITS +0+201480 0+1480 0+98 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+201518 0+1518 0+18 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+#...
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x1000
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +LOAD +0x0+ 0x0+ 0x0+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x200000
+ +LOAD +0x0+131a 0x0+20131a 0x0+20131a 0x0+216 0x0+216 RW +0x200000
+ +DYNAMIC +0x0+1380 0x0+201380 0x0+201380 0x0+100 0x0+100 RW +0x8
+ +TLS +0x0+131a 0x0+20131a 0x0+20131a 0x0+60 0x0+80 R +0x1
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 +.hash .dynsym .dynstr .rela.dyn .plt .plt.got .text *
+ +01 +.tdata .dynamic .got .got.plt *
+ +02 +.dynamic *
+ +03 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 15 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +24
+[0-9a-f ]+R_X86_64_TPOFF64 +30
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +64
+[0-9a-f ]+R_X86_64_TPOFF64 +50
+[0-9a-f ]+R_X86_64_TPOFF64 +70
+[0-9a-f ]+R_X86_64_DTPMOD64 +0
+[0-9a-f ]+R_X86_64_TPOFF64 +44
+[0-9a-f ]+R_X86_64_TPOFF64 +0+10 sg5 \+ 0
+[0-9a-f ]+R_X86_64_GLOB_DAT +0+ __tls_get_addr \+ 0
+[0-9a-f ]+R_X86_64_DTPMOD64 +0+ sg1 \+ 0
+[0-9a-f ]+R_X86_64_DTPOFF64 +0+ sg1 \+ 0
+[0-9a-f ]+R_X86_64_TPOFF64 +0+4 sg2 \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* TLS +GLOBAL +DEFAULT +8 sg8
+.* TLS +GLOBAL +DEFAULT +8 sg3
+.* TLS +GLOBAL +DEFAULT +8 sg4
+.* TLS +GLOBAL +DEFAULT +8 sg5
+.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +DEFAULT +8 sg1
+.* FUNC +GLOBAL +DEFAULT +7 fn1
+.* NOTYPE +GLOBAL +DEFAULT +12 __bss_start
+.* TLS +GLOBAL +DEFAULT +8 sg2
+.* TLS +GLOBAL +DEFAULT +8 sg6
+.* TLS +GLOBAL +DEFAULT +8 sg7
+.* NOTYPE +GLOBAL +DEFAULT +12 _edata
+.* NOTYPE +GLOBAL +DEFAULT +12 _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+.* NOTYPE +LOCAL +DEFAULT +UND *
+.* SECTION +LOCAL +DEFAULT +1 *
+.* SECTION +LOCAL +DEFAULT +2 *
+.* SECTION +LOCAL +DEFAULT +3 *
+.* SECTION +LOCAL +DEFAULT +4 *
+.* SECTION +LOCAL +DEFAULT +5 *
+.* SECTION +LOCAL +DEFAULT +6 *
+.* SECTION +LOCAL +DEFAULT +7 *
+.* SECTION +LOCAL +DEFAULT +8 *
+.* SECTION +LOCAL +DEFAULT +9 *
+.* SECTION +LOCAL +DEFAULT +10 *
+.* SECTION +LOCAL +DEFAULT +11 *
+.* SECTION +LOCAL +DEFAULT +12 *
+.* FILE +LOCAL +DEFAULT +ABS tmpdir/tlspic3.o
+.* TLS +LOCAL +DEFAULT +8 sl1
+.* TLS +LOCAL +DEFAULT +8 sl2
+.* TLS +LOCAL +DEFAULT +8 sl3
+.* TLS +LOCAL +DEFAULT +8 sl4
+.* TLS +LOCAL +DEFAULT +8 sl5
+.* TLS +LOCAL +DEFAULT +8 sl6
+.* TLS +LOCAL +DEFAULT +8 sl7
+.* TLS +LOCAL +DEFAULT +8 sl8
+.* FILE +LOCAL +DEFAULT +ABS
+.* TLS +LOCAL +DEFAULT +9 sH1
+.* OBJECT +LOCAL +DEFAULT +10 _DYNAMIC
+.* TLS +LOCAL +DEFAULT +8 sh3
+.* TLS +LOCAL +DEFAULT +9 sH2
+.* TLS +LOCAL +DEFAULT +9 sH7
+.* TLS +LOCAL +DEFAULT +8 sh7
+.* TLS +LOCAL +DEFAULT +8 sh8
+.* TLS +LOCAL +DEFAULT +9 sH4
+.* TLS +LOCAL +DEFAULT +8 sh4
+.* TLS +LOCAL +DEFAULT +9 sH3
+.* TLS +LOCAL +DEFAULT +8 sh5
+.* TLS +LOCAL +DEFAULT +9 sH5
+.* TLS +LOCAL +DEFAULT +9 sH6
+.* TLS +LOCAL +DEFAULT +9 sH8
+.* TLS +LOCAL +DEFAULT +8 sh1
+.* OBJECT +LOCAL +DEFAULT +12 _GLOBAL_OFFSET_TABLE_
+.* TLS +LOCAL +DEFAULT +8 sh2
+.* TLS +LOCAL +DEFAULT +8 sh6
+.* TLS +GLOBAL +DEFAULT +8 sg8
+.* TLS +GLOBAL +DEFAULT +8 sg3
+.* TLS +GLOBAL +DEFAULT +8 sg4
+.* TLS +GLOBAL +DEFAULT +8 sg5
+.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
+.* TLS +GLOBAL +DEFAULT +8 sg1
+.* FUNC +GLOBAL +DEFAULT +7 fn1
+.* NOTYPE +GLOBAL +DEFAULT +12 __bss_start
+.* TLS +GLOBAL +DEFAULT +8 sg2
+.* TLS +GLOBAL +DEFAULT +8 sg6
+.* TLS +GLOBAL +DEFAULT +8 sg7
+.* NOTYPE +GLOBAL +DEFAULT +12 _edata
+.* NOTYPE +GLOBAL +DEFAULT +12 _end
diff --git a/ld/testsuite/ld-x86-64/tlspic2.sd b/ld/testsuite/ld-x86-64/tlspic2.sd
new file mode 100644
index 0000000..9a7dca4
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic2.sd
@@ -0,0 +1,20 @@
+#source: tlspic3.s
+#source: tlspic2.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -sj.got
+#target: x86_64-*-*
+
+.*: +file format elf64-x86-64.*
+
+Contents of section .got:
+ [0-9a-f]+ 00000000 00000000 20000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 60000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 00000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 40000000 00000000 .*
+ [0-9a-f]+ 00000000 00000000 +.*
diff --git a/ld/testsuite/ld-x86-64/tlspic2.td b/ld/testsuite/ld-x86-64/tlspic2.td
new file mode 100644
index 0000000..68a0a16
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic2.td
@@ -0,0 +1,16 @@
+#source: tlspic3.s
+#source: tlspic2.s
+#as: --64
+#ld: -shared -melf_x86_64 --no-ld-generated-unwind-info
+#objdump: -sj.tdata
+#target: x86_64-*-*
+
+.*: +file format elf64-x86-64.*
+
+Contents of section .tdata:
+ [0-9a-f]+ 11000000 12000000 13000000 14000000 .*
+ [0-9a-f]+ 15000000 16000000 17000000 18000000 .*
+ [0-9a-f]+ 41000000 42000000 43000000 44000000 .*
+ [0-9a-f]+ 45000000 46000000 47000000 48000000 .*
+ [0-9a-f]+ 01010000 02010000 03010000 04010000 .*
+ [0-9a-f]+ 05010000 06010000 07010000 08010000 .*
diff --git a/ld/testsuite/ld-x86-64/tlspic3.s b/ld/testsuite/ld-x86-64/tlspic3.s
new file mode 100644
index 0000000..daa2300
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspic3.s
@@ -0,0 +1,290 @@
+ /* Force .data aligned to 4K, so .got very likely gets at 0x102190
+ (0x60 bytes .tdata and 0x130 bytes .dynamic) */
+ .data
+ .balign 4096
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ /* Force .text aligned to 4K, so it very likely gets at 0x1000. */
+ .text
+ .balign 4096
+ .globl fn1
+ .type fn1,@function
+fn1:
+ pushq %rbp
+ movq %rsp, %rbp
+ nop;nop;nop;nop
+
+ /* GD */
+ .byte 0x66
+ leaq sg1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is referenced through IE too */
+ .byte 0x66
+ leaq sg2@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD against local variable */
+ .byte 0x66
+ leaq sl1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> IE against local variable referenced through IE too */
+ .byte 0x66
+ leaq sl2@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD against hidden and local variable */
+ .byte 0x66
+ leaq sh1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ .byte 0x66
+ leaq sh2@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD against hidden but not local variable */
+ .byte 0x66
+ leaq sH1@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ .byte 0x66
+ leaq sH2@tlsgd(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop;nop;nop;nop
+
+ /* LD */
+ leaq sl1@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop
+ leaq sl1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq 2+sl2@dtpoff(%rax), %r9
+ nop;nop;nop;nop
+
+ /* LD against hidden and local variables */
+ leaq sh1@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop
+ leaq sh1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq sh2@dtpoff+3(%rax), %rcx
+ nop;nop;nop;nop
+
+ /* LD against hidden but not local variables */
+ leaq sH1@tlsld(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ nop
+ leaq sH1@dtpoff(%rax), %r12
+ nop;nop
+ leaq sH2@dtpoff+1(%rax), %rcx
+ nop;nop
+
+ /* IE against global var */
+ movq %fs:0, %rcx
+ nop;nop
+ addq sg2@gottpoff(%rip), %rcx
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ movq %fs:0, %r14
+ nop;nop
+ addq sl2@gottpoff(%rip), %r14
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ movq %fs:0, %rcx
+ nop;nop
+ addq sh2@gottpoff(%rip), %rcx
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ movq %fs:0, %rcx
+ nop;nop
+ addq sH2@gottpoff(%rip), %rcx
+ nop;nop;nop;nop
+
+ /* Direct access through %fs */
+
+ /* IE against global var */
+ movq sg5@gottpoff(%rip), %rcx
+ nop;nop
+ movq %fs:(%rcx), %rdx
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ movq sl5@gottpoff(%rip), %r10
+ nop;nop
+ movq %fs:(%r10), %r12
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ movq sh5@gottpoff(%rip), %rdx
+ nop;nop
+ movq %fs:(%rdx), %rdx
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ movq sH5@gottpoff(%rip), %rcx
+ nop;nop
+ movq %fs:(%rcx), %rdx
+ nop;nop;nop;nop
+
+1: movabsq $_GLOBAL_OFFSET_TABLE_-1b, %r11
+ pushq %r15
+ pushq %r15
+ leaq 1b(%rip), %r15
+ addq %r11, %r15
+ nop;nop
+
+ /* -mcmodel=large sequences */
+
+ /* -mcmodel=large GD */
+ leaq sg1@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD -> IE because variable is referenced through IE too */
+ leaq sg2@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD against local variable */
+ leaq sl1@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD -> IE against local variable referenced through IE too */
+ leaq sl2@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD against hidden and local variable */
+ leaq sh1@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD -> IE against hidden and local variable referenced through
+ IE too */
+ leaq sh2@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD against hidden but not local variable */
+ leaq sH1@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large GD -> IE against hidden but not local variable referenced through
+ IE too */
+ leaq sH2@tlsgd(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop;nop;nop
+
+ /* -mcmodel=large LD */
+ leaq sl1@tlsld(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop
+ leaq sl1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq 2+sl2@dtpoff(%rax), %r9
+ nop;nop;nop;nop
+
+ /* -mcmodel=large LD against hidden and local variables */
+ leaq sh1@tlsld(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop
+ leaq sh1@dtpoff(%rax), %rdx
+ nop;nop
+ leaq sh2@dtpoff+3(%rax), %rcx
+ nop;nop;nop;nop
+
+ /* -mcmodel=large LD against hidden but not local variables */
+ leaq sH1@tlsld(%rip), %rdi
+ movabsq $__tls_get_addr@pltoff, %rax
+ addq %r15, %rax
+ call *%rax
+ nop;nop
+ leaq sH1@dtpoff(%rax), %r12
+ nop;nop
+ leaq sH2@dtpoff+1(%rax), %rcx
+ nop;nop
+
+ popq %r15
+ popq %r15
+
+ leave
+ ret
diff --git a/ld/testsuite/ld-x86-64/tlspie2.s b/ld/testsuite/ld-x86-64/tlspie2.s
new file mode 100644
index 0000000..28867a9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspie2.s
@@ -0,0 +1,58 @@
+ .text
+ .globl __tls_get_addr
+ .type __tls_get_addr, @function
+__tls_get_addr:
+ ret
+ .size __tls_get_addr, .-__tls_get_addr
+.globl _start
+ .type _start, @function
+_start:
+ movq foo3@GOTTPOFF(%rip), %rax
+ pushq %rbx
+ movl %fs:foo2@TPOFF, %ebx
+ addl %fs:foo1@TPOFF, %ebx
+ addl %fs:(%rax), %ebx
+ leaq foo4@TLSLD(%rip), %rdi
+ call *__tls_get_addr@GOTPCREL(%rip)
+ addl foo4@DTPOFF(%rax), %ebx
+ .byte 0x66
+ leaq foo5@TLSGD(%rip), %rdi
+ .byte 0x66
+ rex64
+ call *__tls_get_addr@GOTPCREL(%rip)
+ addl (%rax), %ebx
+ movl %ebx, %eax
+ popq %rbx
+ ret
+ .size _start, .-_start
+.globl foo1
+ .section .tbss,"awT",@nobits
+ .align 4
+ .type foo1, @object
+ .size foo1, 4
+foo1:
+ .zero 4
+.globl foo2
+ .align 4
+ .type foo2, @object
+ .size foo2, 4
+foo2:
+ .zero 4
+.globl foo3
+ .align 4
+ .type foo3, @object
+ .size foo3, 4
+foo3:
+ .zero 4
+.globl foo4
+ .align 4
+ .type foo4, @object
+ .size foo4, 4
+foo4:
+ .zero 4
+.globl foo5
+ .align 4
+ .type foo5, @object
+ .size foo5, 4
+foo5:
+ .zero 4
diff --git a/ld/testsuite/ld-x86-64/tlspie2a.d b/ld/testsuite/ld-x86-64/tlspie2a.d
new file mode 100644
index 0000000..ada385d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspie2a.d
@@ -0,0 +1,6 @@
+#source: tlspie2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -pie
+#readelf: -r
+
+There are no relocations in this file.
diff --git a/ld/testsuite/ld-x86-64/tlspie2b.d b/ld/testsuite/ld-x86-64/tlspie2b.d
new file mode 100644
index 0000000..6f96fa3
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspie2b.d
@@ -0,0 +1,28 @@
+#source: tlspie2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -pie
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <__tls_get_addr>:
+[ ]*[a-f0-9]+: c3 retq
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 c7 c0 f4 ff ff ff mov \$0xfffffffffffffff4,%rax
+[ ]*[a-f0-9]+: 53 push %rbx
+[ ]*[a-f0-9]+: 64 8b 1c 25 f0 ff ff ff mov %fs:0xfffffffffffffff0,%ebx
+[ ]*[a-f0-9]+: 64 03 1c 25 ec ff ff ff add %fs:0xffffffffffffffec,%ebx
+[ ]*[a-f0-9]+: 64 03 18 add %fs:\(%rax\),%ebx
+[ ]*[a-f0-9]+: 66 66 66 66 64 48 8b 04 25 00 00 00 00 data16 data16 data16 data16 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 03 98 f8 ff ff ff add -0x8\(%rax\),%ebx
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 48 8d 80 fc ff ff ff lea -0x4\(%rax\),%rax
+[ ]*[a-f0-9]+: 03 18 add \(%rax\),%ebx
+[ ]*[a-f0-9]+: 89 d8 mov %ebx,%eax
+[ ]*[a-f0-9]+: 5b pop %rbx
+[ ]*[a-f0-9]+: c3 retq
+#pass
diff --git a/ld/testsuite/ld-x86-64/tlspie2c.d b/ld/testsuite/ld-x86-64/tlspie2c.d
new file mode 100644
index 0000000..35627da
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/tlspie2c.d
@@ -0,0 +1,28 @@
+#source: tlspie2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -pie -z call-nop=suffix-nop
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <__tls_get_addr>:
+[ ]*[a-f0-9]+: c3 retq
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 c7 c0 f4 ff ff ff mov \$0xfffffffffffffff4,%rax
+[ ]*[a-f0-9]+: 53 push %rbx
+[ ]*[a-f0-9]+: 64 8b 1c 25 f0 ff ff ff mov %fs:0xfffffffffffffff0,%ebx
+[ ]*[a-f0-9]+: 64 03 1c 25 ec ff ff ff add %fs:0xffffffffffffffec,%ebx
+[ ]*[a-f0-9]+: 64 03 18 add %fs:\(%rax\),%ebx
+[ ]*[a-f0-9]+: 66 66 66 66 64 48 8b 04 25 00 00 00 00 data16 data16 data16 data16 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 03 98 f8 ff ff ff add -0x8\(%rax\),%ebx
+[ ]*[a-f0-9]+: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax
+[ ]*[a-f0-9]+: 48 8d 80 fc ff ff ff lea -0x4\(%rax\),%rax
+[ ]*[a-f0-9]+: 03 18 add \(%rax\),%ebx
+[ ]*[a-f0-9]+: 89 d8 mov %ebx,%eax
+[ ]*[a-f0-9]+: 5b pop %rbx
+[ ]*[a-f0-9]+: c3 retq
+#pass
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index b3ceaa1..7fd953b 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -55,6 +55,13 @@ set x86_64tests {
{{readelf -WSsrl tlspic.rd} {objdump -drj.text\ -Mintel64 tlspic.dd}
{objdump -sj.got tlspic.sd} {objdump -sj.tdata tlspic.td}}
"libtlspic.so"}
+ {"TLS -fpic -shared transitions with r15 as GOT base"
+ "-shared -melf_x86_64 --no-ld-generated-unwind-info" ""
+ "--64 -mrelax-relocations=yes"
+ {tlspic3.s tlspic2.s}
+ {{readelf -WSsrl tlspic2.rd} {objdump -drj.text\ -Mintel64 tlspic2.dd}
+ {objdump -sj.got tlspic2.sd} {objdump -sj.tdata tlspic2.td}}
+ "libtlspic2.so"}
{"TLS descriptor -fpic -shared transitions"
"-shared -melf_x86_64 --no-ld-generated-unwind-info" ""
"--64" {tlsdesc.s tlspic2.s}
@@ -69,6 +76,12 @@ set x86_64tests {
{{readelf -WSsrl tlsbin.rd} {objdump -drj.text tlsbin.dd}
{objdump -sj.got tlsbin.sd} {objdump -sj.tdata tlsbin.td}}
"tlsbin"}
+ {"TLS -fpic and -fno-pic exec transitions without PLT"
+ "-melf_x86_64 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
+ "-mrelax-relocations=yes --64" {tlsbinpic2.s tlsbin.s}
+ {{readelf -WSsrl tlsbin2.rd} {objdump -drj.text tlsbin2.dd}
+ {objdump -sj.got tlsbin2.sd} {objdump -sj.tdata tlsbin2.td}}
+ "tlsbin2"}
{"TLS descriptor -fpic and -fno-pic exec transitions"
"-melf_x86_64 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
"--64" {tlsbindesc.s tlsbin.s}
@@ -114,12 +127,20 @@ set x86_64tests {
"--64" {tlsgd5b.s} {} "libtlsgd5.so"}
{"TLS GD->IE transition" "-melf_x86_64 tmpdir/libtlsgd5.so" ""
"--64" {tlsgd5a.s}
- {{objdump -dwr tlsgd5.dd}} "tlsgd5"}
+ {{objdump -dwr tlsgd5.dd}} "tlsgd5a"}
+ {"TLS GD->IE transition without PLT"
+ "-melf_x86_64 tmpdir/libtlsgd5.so" ""
+ "-mrelax-relocations=yes --64" {tlsgd5c.s}
+ {{objdump -dwr tlsgd5.dd}} "tlsgd5b"}
{"Helper TLS X32 GD->IE transition DSO" "-shared -melf32_x86_64" ""
"--x32" {tlsgd6b.s} {} "libtlsgd6.so"}
{"TLS X32 GD->IE transition" "-melf32_x86_64 tmpdir/libtlsgd6.so" ""
"--x32" {tlsgd6a.s}
- {{objdump -dwr tlsgd6.dd}} "tlsgd6"}
+ {{objdump -dwr tlsgd6.dd}} "tlsgd6a"}
+ {"TLS X32 GD->IE transition without PLT"
+ "-melf32_x86_64 tmpdir/libtlsgd6.so" ""
+ "-mrelax-relocations=yes --x32" {tlsgd6c.s}
+ {{objdump -dwr tlsgd6.dd}} "tlsgd6b"}
{"TLS X32 LD->LE transition" "-melf32_x86_64" ""
"--x32" {tlsld2.s}
{{objdump -dwr tlsld2.dd}} "tlsld2"}
@@ -129,10 +150,38 @@ set x86_64tests {
{"TLS -mcmodel=large LD->LE transition" "-melf_x86_64" ""
"--64" {tlsld3.s}
{{objdump -dwr tlsld3.dd}} "tlsld3"}
+ {"TLS -mcmodel=large LD->LE transition with r15 as GOT base"
+ "-melf_x86_64" ""
+ "--64" {tlsld4.s}
+ {{objdump -dwr tlsld4.dd}} "tlsld4"}
+ {"TLS LD->LE transition without PLT"
+ "-melf_x86_64" ""
+ "--64 -mrelax-relocations=yes"
+ {tlsld5.s}
+ {{objdump -dwr tlsld5.dd}} "tlsld5"}
+ {"TLS X32 LD->LE transition without PLT" "-melf32_x86_64" ""
+ "--x32 -mrelax-relocations=yes"
+ {tlsld6.s}
+ {{objdump -dwr tlsld6.dd}} "tlsld6"}
{"TLS -mcmodel=large GD->IE transition" "-melf_x86_64 tmpdir/libtlsgd5.so" ""
"--64" {tlsgd8.s}
{{objdump -dwrj.text tlsgd8.dd}} "tlsgd8"}
-
+ {"TLS -mcmodel=large GD->LE transition with r15 as GOT base"
+ "-melf_x86_64" ""
+ "--64" {tlsgd9.s}
+ {{objdump -dwr tlsgd9.dd}} "tlsgd9"}
+ {"TLS -mcmodel=large GD->IE transition with r15 as GOT base"
+ "-melf_x86_64 tmpdir/libtlsgd5.so" ""
+ "--64" {tlsgd10.s}
+ {{objdump -dwrj.text tlsgd10.dd}} "tlsgd10"}
+ {"TLS GD->LE transition without PLT"
+ "-melf_x86_64" ""
+ "--64" {tlsgd11.s}
+ {{objdump -dwr tlsgd11.dd}} "tlsgd11"}
+ {"TLS X32 GD->LE transition without PLT"
+ "-melf32_x86_64" ""
+ "--x32" {tlsgd14.s}
+ {{objdump -dwr tlsgd14.dd}} "tlsgd14"}
{"build 32-bit object with 33 locals" "-melf_x86_64 -e 0" "" "--32" {32bit.s} {{ ld incompatible.l }} "dummy" }
{"build 64-bit object" "-melf_x86_64 -e 0 --defsym foo=1" "" "--64" {64bit.s} {} "dummy" }
{"link mixed objects" "-melf_x86_64 -e 0 tmpdir/32bit.o tmpdir/64bit.o" "" "" {} { { ld incompatible.l } } "mixed"}
@@ -216,6 +265,8 @@ run_dump_test "pcrel8"
run_dump_test "pcrel16"
run_dump_test "tlsgd2"
run_dump_test "tlsgd3"
+run_dump_test "tlsgd12"
+run_dump_test "tlsgd13"
run_dump_test "tlsie2"
run_dump_test "tlsie3"
run_dump_test "hidden1"
@@ -236,6 +287,9 @@ run_dump_test "protected7a"
run_dump_test "protected7b"
run_dump_test "tlsle1"
run_dump_test "tlspie1"
+run_dump_test "tlspie2a"
+run_dump_test "tlspie2b"
+run_dump_test "tlspie2c"
run_dump_test "unique1"
run_dump_test "nogot1"
run_dump_test "nogot2"