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.