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.