下表中列出的 TLS 重定位是针对 SPARC 定义的。此表中的说明使用以下表示法。
在 GOT 中分配两个连续项,以存储 TLS_index 结构。此信息将传递给 __tls_get_addr()。引用此项的指令将绑定到两个 GOT 项中的第一项的地址。
在 GOT 中分配两个连续项,以存储 TLS_index 结构。此信息将传递给 __tls_get_addr()。将此结构的 ti_tlsoffset 字段设置为 0,并且在运行时填充 ti_moduleid。对 __tls_get_addr() 的调用将返回动态 TLS 块的起始偏移。
计算相对于 TLS 块的 tlsoffset。
计算相对于静态 TLS 块的负 tlsoffset。将此值与线程指针相加以计算 TLS 地址。
计算包含 TLS 符号的目标文件的标识符。
名称 |
值 |
字段 |
计算 |
---|---|---|---|
R_SPARC_TLS_GD_HI22 |
56 |
T-simm22 |
@dtlndx(S + A) >> 10 |
R_SPARC_TLS_GD_LO10 |
57 |
T-simm13 |
@dtlndx(S + A) & 0x3ff |
R_SPARC_TLS_GD_ADD |
58 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_GD_CALL |
59 |
V-disp30 |
请参阅此表后面的说明。 |
R_SPARC_TLS_LDM_HI22 |
60 |
T-simm22 |
@tmndx(S + A) >> 10 |
R_SPARC_TLS_LDM_LO10 |
61 |
T-simm13 |
@tmndx(S + A) & 0x3ff |
R_SPARC_TLS_LDM_ADD |
62 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_LDM_CALL |
63 |
V-disp30 |
请参阅此表后面的说明。 |
R_SPARC_TLS_LDO_HIX22 |
64 |
T-simm22 |
@dtpoff(S + A) >> 10 |
R_SPARC_TLS_LDO_LOX10 |
65 |
T-simm13 |
@dtpoff(S + A) & 0x3ff |
R_SPARC_TLS_LDO_ADD |
66 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_IE_HI22 |
67 |
T-simm22 |
@got(@tpoff(S + A)) >> 10 |
R_SPARC_TLS_IE_LO10 |
68 |
T-simm13 |
@got(@tpoff(S + A)) & 0x3ff |
R_SPARC_TLS_IE_LD |
69 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_IE_LDX |
70 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_IE_ADD |
71 |
无 |
请参阅此表后面的说明。 |
R_SPARC_TLS_LE_HIX22 |
72 |
T-imm22 |
(@tpoff(S + A) ^0xffffffffffffffff) >> 10 |
R_SPARC_TLS_LE_LOX10 |
73 |
T-simm13 |
(@tpoff(S + A) & 0x3ff) | 0x1c00 |
R_SPARC_TLS_DTPMOD32 |
74 |
V-word32 |
@dtpmod(S + A) |
R_SPARC_TLS_DTPMOD64 |
75 |
V-word64 |
@dtpmod(S + A) |
R_SPARC_TLS_DTPOFF32 |
76 |
V-word32 |
@dtpoff(S + A) |
R_SPARC_TLS_DTPOFF64 |
77 |
V-word64 |
@dtpoff(S + A) |
R_SPARC_TLS_TPOFF32 |
78 |
V-word32 |
@tpoff(S + A) |
R_SPARC_TLS_TPOFF64 |
79 |
V-word64 |
@tpoff(S + A) |
一些重定位类型的语义不只是简单的计算。
此重定位标记 GD 代码序列的 add 指令。用于 GOT 指针的寄存器是此序列中的第一个寄存器。此重定位标记的指令出现在 R_SPARC_TLS_GD_CALL 重定位标记的 call 指令前面。此重定位用于在链接编辑时在 TLS 模型之间进行转换。
可以按处理引用 __tls_get_addr() 函数的 R_SPARC_WPLT30 重定位的方式处理此重定位。此重定位是 GD 代码序列的一部分。
此重定位标记 LD 代码序列的第一个 add 指令。用于 GOT 指针的寄存器是此序列中的第一个寄存器。此重定位标记的指令出现在 R_SPARC_TLS_GD_CALL 重定位标记的 call 指令前面。此重定位用于在链接编辑时在 TLS 模型之间进行转换。
可以按处理引用 __tls_get_addr() 函数的 R_SPARC_WPLT30 重定位的方式处理此重定位。此重定位是 LD 代码序列的一部分。
此重定位标记 LD 代码序列中的最后一个 add 指令。包含目标文件地址(在代码序列的初始部分中计算得出)的寄存器是此指令中的第一个寄存器。此重定位允许链接编辑器标识此寄存器以进行代码变换。
此重定位标记 32 位 IE 代码序列中的 ld 指令。此重定位用于在链接编辑时在 TLS 模型之间进行转换。
此重定位标记 64 位 IE 代码序列中的 ldx 指令。此重定位用于在链接编辑时在 TLS 模型之间进行转换。
此重定位标记 IE 代码序列中的 add 指令。用于 GOT 指针的寄存器是此序列中的第一个寄存器。