https://sourceware.org/bugzilla/show_bug.cgi?id=20216
Bug ID: 20216 Summary: Gold should support x86-64 TLS code sequences without PLT Product: binutils Version: 2.27 (HEAD) Status: NEW Severity: normal Priority: P2 Component: gold Assignee: ccoutant at gmail dot com Reporter: hjl.tools at gmail dot com CC: ian at airs dot com Target Milestone: --- Target: x86-64 ld supports x86-64 TLS code sequences without PLT: commit e2cbcd9156d1606a9f2153aecd93a89fe6e29180 Author: H.J. Lu <hjl.to...@gmail.com> Date: Mon Jun 6 11:06:55 2016 -0700 Support x86-64 TLS code sequences without PLT Gold should also support it: [hjl@gnu-6 tls-10a]$ cat main.c #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; } [hjl@gnu-6 tls-10a]$ cat def.c __thread int gd = 1; [hjl@gnu-6 tls-10a]$ cat gd.S .text .p2align 4,,15 .globl get_gd .type get_gd, @function get_gd: subq $8, %rsp .byte 0x66 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 .byte 0x66 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 .byte 0x66 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 [hjl@gnu-6 tls-10a]$ cat ld.S .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 [hjl@gnu-6 tls-10a]$ make gcc -fuse-ld=gold -fPIE -O3 -fno-asynchronous-unwind-tables -c -o main.o main.c gcc -fuse-ld=gold -fPIE -O3 -fno-asynchronous-unwind-tables -c -o def.o def.c gcc -fuse-ld=gold -fPIE -O3 -fno-asynchronous-unwind-tables -fPIC -c gd.S gcc -fuse-ld=gold -fPIE -O3 -fno-asynchronous-unwind-tables -fPIC -c ld.S ld.gold -shared -o libtls.so gd.o ld.o gcc -fuse-ld=gold -o x main.o def.o libtls.so -Wl,-R,. gcc -fuse-ld=gold -static -o y main.o def.o gd.o ld.o -Wl,-R,. gd.o:function get_gd: error: TLS relocation against invalid instruction gd.o:function get_gd: error: missing expected TLS relocation gd.o:function set_gd: error: missing expected TLS relocation gd.o:function test_gd: error: TLS relocation against invalid instruction gd.o:function test_gd: error: missing expected TLS relocation /usr/local/bin/ld.gold: error: missing expected TLS relocation ld.o:function set_ld: error: TLS relocation against invalid instruction ld.o:function set_ld: error: missing expected TLS relocation ld.o:function set_ld: error: missing expected TLS relocation ld.o:function test_ld: error: missing expected TLS relocation ld.o:function test_ld: error: TLS relocation against invalid instruction ld.o:function test_ld: error: missing expected TLS relocation ld.o:function test_ld: error: missing expected TLS relocation /usr/local/bin/ld.gold: error: missing expected TLS relocation collect2: error: ld returned 1 exit status Makefile:28: recipe for target 'y' failed make: *** [y] Error 1 [hjl@gnu-6 tls-10a]$ -- You are receiving this mail because: You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils