32-bit x86: General Dynamic (GD)
This code sequence implements the GD
model described in Thread-Local Storage Access Models.
Table 16-8 32-bit SPARC: General Dynamic Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 leal x@tlsgd(,%ebx,1), %eax 0x07 call x@tlsgdplt # %eax - contains address of TLS variable |
R_386_TLS_GD R_386_TLS_GD_PLT |
x x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] GOT[n + 1] |
R_386_TLS_DTPMOD32 R_386_TLS_DTPOFF32 |
x |
The leal
instruction generates a R_386_TLS_GD
relocation which instructs the link-editor to allocate space in the GOT
to hold a TLS_index
structure for variable x
. The link-editor processes this relocation by substituting the GOT
-relative offset for the new GOT
entry.
Since the load object index and TLS block index for x
are not known until runtime, the link-editor places the R_386_TLS_DTPMOD32
and R_386_TLS_DTPOFF32
relocations against the GOT
for processing by the runtime linker. The address of the generated GOT
entry is loaded into register %eax
for the call to ___tls_get_addr
().
The call
instruction causes the generation of the R_386_TLS_GD_PLT
relocation. This instructs the link-editor to bind the call to the ___tls_get_addr
() function and associates the call
instruction with the GD
code sequence.
The call
instruction must immediately follow the leal
instruction. This requirement is necessary to permit the code transformations.