This code sequence is the most general, and can be included both in a shared objects and dynamic executables. This code sequence can reference an external TLS variable in either a shared object or dynamic executable.
Table 8–8 x86: 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 global offset table 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 is a required to permit the code transformations.