32-bit SPARC: Initial Executable (IE)
This code sequence implements the IE
model described in Thread-Local Storage Access Models.
Table 16-4 32-bit SPARC: Initial Executable Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
# %l7 - initialized to GOT pointer, %g7 - thread pointer 0x00 sethi %hi(@tpoff(x)), %o0 0x04 or %o0, %lo(@tpoff(x)), %o0 0x08 ld [%l7 + %o0], %o0 0x0c add %g7, %o0, %o0 # %o0 - contains address of TLS variable |
R_SPARC_TLS_IE_HI22 R_SPARC_TLS_IE_LO10 R_SPARC_TLS_IE_LD R_SPARC_TLS_IE_ADD |
x x x x |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_SPARC_TLS_TPOFF32 |
x |
The sethi
instruction and or
instruction generate R_SPARC_TLS_IE_HI22
and R_SPARC_TLS_IE_LO10
relocations, respectively. These relocations instruct the link-editor to create space in the GOT
to store the static TLS offset for symbol x
. An R_SPARC_TLS_TPOFF32
relocation is left outstanding against the GOT
for the runtime linker to fill in with the negative static TLS offset for symbol x
. The ld
and the add
instructions are tagged with the R_SPARC_TLS_IE_LD
and R_SPARC_TLS_IE_ADD
relocations respectively.
Note:
The register used as theGOT
-pointer for the add
instruction tagged by the R_SPARC_TLS_IE_ADD
relocation must be the first register in the instruction. This requirement permits the link-editor to identify the GOT
-pointer register during a code transformation.