链接程序和库指南

32 位 SPARC: 初始可执行 (Initial Executable, IE)

此代码序列实现线程局部存储的访问模型中介绍的 IE 模型。

表 8–4 32 位 SPARC: 初始可执行的线程局部变量的访问代码

代码序列

初始重定位

符号

# %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
 

未完成的重定位

符号

GOT[n]
R_SPARC_TLS_TPOFF32
x

sethi 指令和 or 指令分别生成 R_SPARC_TLS_IE_HI22R_SPARC_TLS_IE_LO10 重定位。这些重定位指示链接编辑器在 GOT 中创建空间,以存储符号 x 的静态 TLS 偏移。针对 GOTR_SPARC_TLS_TPOFF32 重定位未完成,以便运行时链接程序使用符号 x 的负静态 TLS 偏移填充。ldadd 指令分别使用 R_SPARC_TLS_IE_LDR_SPARC_TLS_IE_ADD 重定位标记。


注 –

用作 add 指令(由 R_SPARC_TLS_IE_ADD 重定位标记)的 GOT 指针的寄存器必须是此指令中的第一个寄存器。在代码变换期间,此要求允许链接编辑器标识 GOT 指针寄存器。