binutils-gdb/ld/testsuite/ld-x86-64/tlspic2.dd
H.J. Lu e2cbcd9156 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-06 11:07:16 -07:00

379 lines
14 KiB
Plaintext

#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