SPARC: General Dynamic (GD)
This code sequence implements the GD
model described in Thread-Local Storage Access Models.
Table 16-2 SPARC: General Dynamic Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
# %l7 - initialized to GOT pointer 0x00 sethi %hi(@dtlndx(x)), %o0 0x04 add %o0, %lo(@dtlndx(x)), %o0 0x08 add %l7, %o0, %o0 0x0c call x@TLSPLT # %o0 - contains address of TLS variable |
R_SPARC_TLS_GD_HI22 R_SPARC_TLS_GD_LO10 R_SPARC_TLS_GD_ADD R_SPARC_TLS_GD_CALL |
x x x x |
→ |
Outstanding Relocations: 32-bit |
Symbol |
GOT[n] GOT[n + 1] |
R_SPARC_TLS_DTPMOD32 R_SPARC_TLS_DTPOFF32 |
x x |
→ |
Outstanding Relocations: 64-bit |
Symbol |
GOT[n] GOT[n + 1] |
R_SPARC_TLS_DTPMOD64 R_SPARC_TLS_DTPOFF64 |
x x |
The sethi
, and add
instructions generate R_SPARC_TLS_GD_HI22
and R_SPARC_TLS_GD_LO10
relocations respectively. These relocations instruct 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.
The load object index and TLS block index for x
are not known until runtime. Therefore, the link-editor places the R_SPARC_TLS_DTPMOD32
and R_SPARC_TLS_DPTOFF32
relocations against the GOT
for processing by the runtime linker.
The second add
instruction causes the generation of the R_SPARC_TLS_GD_ADD
relocation. This relocation is used only if the GD code sequence is changed to another sequence by the link-editor.
The call
instruction uses the special syntax, x@TLSPLT
. This call references the TLS variable and generates the R_SPARC_TLS_GD_CALL
relocation. This relocation instructs the link-editor to bind the call to the __tls_get_addr
() function, and associates the call
instruction with the GD code sequence.
Note:
Theadd
instruction must appear before the call
instruction. The add
instruction can not be placed into the delay slot for the call. This requirement is necessary as the code-transformations that can occur later require a known order. The register used as the GOT
-pointer for the add
instruction tagged by the R_SPARC_TLS_GD_ADD
relocation, must be the first register in the add
instruction. This requirement permits the link-editor to identify the GOT
-pointer register during a code transformation.