Support x86-64 TLS code sequences without PLT
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.
2016-06-07 02:06:55 +08:00
|
|
|
#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]+\] .symtab +.*
|
|
|
|
+\[[ 0-9]+\] .strtab +.*
|
2016-08-19 16:16:30 +08:00
|
|
|
+\[[ 0-9]+\] .shstrtab +.*
|
Support x86-64 TLS code sequences without PLT
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.
2016-06-07 02:06:55 +08:00
|
|
|
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
|