.globl fn
.type fn,@function
fn:
- /* Main binary, no PIC */
+ /* Main binary, no PIC. */
1: movl 1b, %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
- /* foo can be anywhere in startup TLS */
+ /* foo can be anywhere in startup TLS. */
movl %gs:0, %eax
subl foo@GOTTPOFF(%edx), %eax
- /* %eax now contains &foo */
+ /* %eax now contains &foo. */
- /* bar only in the main program */
+ /* bar only in the main program. */
movl %gs:0, %eax
subl $bar@TPOFF, %eax
- /* %eax now contains &bar */
+ /* %eax now contains &bar. */
- /* baz only in the main program */
+ /* baz only in the main program. */
movl %gs:0, %ecx
- /* Arbitrary instructions in between */
+ /* Arbitrary instructions in between. */
nop
subl $baz@TPOFF, %ecx
- /* %ecx now contains &baz */
+ /* %ecx now contains &baz. */
- /* var and var2 only in the main program */
+ /* var and var2 only in the main program. */
movl %gs:0, %ecx
- /* Arbitrary instructions in between */
+ /* Arbitrary instructions in between. */
nop
nop
leal var@NTPOFF(%ecx), %eax
- /* Arbitrary instructions in between */
+ /* 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