32-bit x86: Initial Executable (IE)
This code sequence implements the IE
model described in Thread-Local Storage Access Models.
Two code-sequences for the IE
model exist. One sequence is for position independent code which uses a GOT
-pointer. The other sequence is for position dependent code which does not use a GOT
-pointer.
Table 16-10 32-bit x86: Initial Executable, Position Independent, Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 movl %gs:0, %eax 0x06 addl x@gotntpoff(%ebx), %eax # %eax - contains address of TLS variable |
<none> R_386_TLS_GOTIE |
x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_386_TLS_TPOFF |
x |
The addl
instruction generates a R_386_TLS_GOTIE
relocation. This relocation instructs the link-editor to create space in the GOT
to store the static TLS offset for symbol x
. A R_386_TLS_TPOFF
relocation is left outstanding against the GOT
table for the runtime linker to fill in with the static TLS offset for symbol x
.
Table 16-11 32-bit x86: Initial Executable, Position Dependent, Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 movl %gs:0, %eax 0x06 addl x@indntpoff, %eax # %eax - contains address of TLS variable |
<none> R_386_TLS_IE |
x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_386_TLS_TPOFF |
x |
The addl
instruction generates a R_386_TLS_IE
relocation. This relocation instructs the link-editor to create space in the GOT
to store the static TLS offset for symbol x
. The main difference between this sequence and the position independent form, is that the instruction is bound directly to the GOT
entry created, instead of using an offset off of the GOT
-pointer register. A R_386_TLS_TPOFF
relocation is left outstanding against the GOT
for the runtime linker to fill in with the static TLS offset for symbol x
.
The contents of variable x
, rather than the address, can be loaded by embedding the offset directly into the memory reference as shown in the next two sequences.
Table 16-12 32-bit x86: Initial Executable, Position Independent, Dynamic Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 movl x@gotntpoff(%ebx), %eax 0x06 movl %gs:(%eax), %eax # %eax - contains address of TLS variable |
R_386_TLS_GOTIE <none> |
x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_386_TLS_TPOFF |
x |
Table 16-13 32-bit x86: Initial Executable, Position Independent, Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 movl x@indntpoff, %ecx 0x06 movl %gs:(%ecx), %eax # %eax - contains address of TLS variable |
R_386_TLS_IE <none> |
x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_386_TLS_TPOFF |
x |
In the last sequence, if the %eax
register is used instead of the %ecx
register, the first instruction can be either 5 or 6 bytes long.