| .section ".tdata", "awT", @progbits |
| .globl baz |
| .hidden baz |
| .globl var |
| .hidden var2 |
| bar: .long 27 |
| baz: .long 29 |
| var: .long 31 |
| var2: .long 33 |
| .text |
| .globl fn |
| .type fn,@function |
| fn: |
| /* Main binary, no PIC. */ |
| 1: movl 1b, %edx |
| addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx |
| |
| /* foo can be anywhere in startup TLS. */ |
| movl %gs:0, %eax |
| subl foo@GOTTPOFF(%edx), %eax |
| /* %eax now contains &foo. */ |
| |
| /* bar only in the main program. */ |
| movl %gs:0, %eax |
| subl $bar@TPOFF, %eax |
| /* %eax now contains &bar. */ |
| |
| /* baz only in the main program. */ |
| movl %gs:0, %ecx |
| /* Arbitrary instructions in between. */ |
| nop |
| subl $baz@TPOFF, %ecx |
| /* %ecx now contains &baz. */ |
| |
| /* var and var2 only in the main program. */ |
| movl %gs:0, %ecx |
| /* Arbitrary instructions in between. */ |
| nop |
| nop |
| leal var@NTPOFF(%ecx), %eax |
| /* Arbitrary instructions in between. */ |
| nop |
| leal var2@NTPOFF(%ecx), %edx |
| |
| /* foo can be anywhere in startup TLS. */ |
| movl foo@INDNTPOFF, %eax |
| movl %gs:(%eax), %eax |
| /* %eax now contains foo. */ |
| |
| movl %gs:0, %eax |
| addl foo@INDNTPOFF, %eax |
| /* %eax now contains &foo. */ |
| |
| ret |