e2cbcd9156
We can generate x86-64 TLS code sequences for general and local dynamic models without PLT, which uses indirect call via GOT: call *__tls_get_addr@GOTPCREL(%rip) instead of direct call: call __tls_get_addr[@PLT] Since direct call is 4-byte long and indirect call, is 5-byte long, the extra one byte must be handled properly. For general dynamic model, one 0x66 prefix before call instruction is removed to make room for indirect call. For local dynamic model, we simply use 5-byte indirect call. TLS linker optimization is updated to recognize new instruction patterns. For local dynamic model to local exec model transition, we generate 4 0x66 prefixes, instead of 3, before mov instruction in 64-bit and generate a 5-byte nop, instead of 4-byte, before mov instruction in 32-bit. Since linker may convert call *__tls_get_addr@GOTPCREL(%rip) to addr32 call __tls_get_addr when producing static executable, both patterns are recognized. bfd/ * elf64-x86-64.c (elf_x86_64_link_hash_entry): Add tls_get_addr. (elf_x86_64_link_hash_newfunc): Initialize tls_get_addr to 2. (elf_x86_64_check_tls_transition): Check indirect call and direct call with the addr32 prefix for general and local dynamic models. Set the tls_get_addr feild. (elf_x86_64_convert_load_reloc): Always use addr32 prefix for indirect __tls_get_addr call via GOT. (elf_x86_64_relocate_section): Handle GD->LE, GD->IE and LD->LE transitions with indirect call and direct call with the addr32 prefix. ld/ * 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.
145 lines
4.9 KiB
R
145 lines
4.9 KiB
R
#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
|