1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
.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
|