x64: Local Dynamic (LD)
This code sequence implements the LD
model described in Thread-Local Storage Access Models.
Table 16-19 x64: Local Dynamic Thread-Local Variable Access Codes
Code Sequence |
Initial Relocations |
Symbol |
0x00 leaq x1@tlsld(%rip), %rdi 0x07 call __tls_get_addr@plt # %rax - contains address of TLS block 0x10 leaq x1@dtpoff(%rax), %rcx # %rcx - contains address of TLS variable x1 0x20 leaq x2@dtpoff(%rax), %r9 # %r9 - contains address of TLS variable x2 |
R_AMD64_TLSLD R_AMD64_PLT32 R_AMD64_DTOFF32 R_AMD64_DTOFF32 |
x1 __tls_get_addr x1 x2 |
→ |
Outstanding Relocations |
Symbol |
GOT[n] |
R_AMD64_DTMOD64 |
x1 |
The first two instructions are equivalent to the code sequence used for the general dynamic model, although without any padding. The two instructions must be consecutive. The x1@tlsld(%rip)
sequence generates a the tls_index
entry for symbol x1
. This index refers to the current module that contains x1
with an offset of zero. The link-editor creates one relocation for the object, R_AMD64_DTMOD64
.
The R_AMD64_DTOFF32
relocation is unnecessary, because offsets are loaded separately. The x1@dtpoff
expression is used to access the offset of the symbol x1
. Using the instruction as address 0x10
, the complete offset is loaded and added to the result of the __tls_get_addr
() call in %rax
to produce the result in %rcx
. The x1@dtpoff
expression creates the R_AMD64_DTPOFF32
relocation.
Instead of computing the address of the variable, the value of the variable can be loaded using the following instruction. This instruction creates the same relocation as the original leaq
instruction.
movq x1@dtpoff(%rax), %r11
Provided the base address of a TLS block is maintained within a register, loading, storing or computing the address of a protected thread-local variable requires one instruction.
Benefits exist in using the local dynamic model over the general dynamic model. Every additional thread-local variable access only requires three new instructions. In addition, no additional GOT
entries, or runtime relocations are required.