Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

SPARC: 线程局部存储的重定位类型

下表中列出的 TLS 重定位是针对 SPARC 定义的。表中的说明使用以下表示法。

@dtlndx(x)

GOT 中分配两个连续项,以存储 TLS_index 结构。此信息将传递给 __tls_get_addr()。引用此项的指令将绑定到两个 GOT 项中第一项的地址。

@tmndx(x)

GOT 中分配两个连续项,以存储 TLS_index 结构。此信息将传递给 __tls_get_addr()。此结构的 ti_tlsoffset 字段设置为 0,并且在运行时填充 ti_moduleid。对 __tls_get_addr() 的调用将返回动态 TLS 块的起始偏移。

@dtpoff(x)

计算相对于 TLS 块的 tlsoffset

@tpoff(x)

计算相对于静态 TLS 块的负 tlsoffset。此值与线程指针相加以计算 TLS 地址。

@dtpmod(x)

计算包含 TLS 符号的目标文件的标识符。

表 14-7  SPARC: 线程局部存储的重定位类型
名称
字段
计算
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)

一些重定位类型的语义不只是简单的计算。

R_SPARC_TLS_GD_ADD

此重定位标记 GD 代码序列的 add 指令。用于 GOT 指针的寄存器是该序列中的第一个寄存器。此重定位所标记的指令出现在 R_SPARC_TLS_GD_CALL 重定位所标记的 call 指令之前。此重定位用于在链接编辑时在 TLS 模型之间进行转换。

R_SPARC_TLS_GD_CALL

此重定位将按引用 __tls_get_addr() 函数的 R_SPARC_WPLT30 重定位的处理方式进行处理。此重定位是 GD 代码序列的一部分。

R_SPARC_LDM_ADD

此重定位标记 LD 代码序列的第一个 add 指令。用于 GOT 指针的寄存器是该序列中的第一个寄存器。此重定位所标记的指令出现在 R_SPARC_TLS_GD_CALL 重定位所标记的 call 指令之前。此重定位用于在链接编辑时在 TLS 模型之间进行转换。

R_SPARC_LDM_CALL

此重定位将按引用 __tls_get_addr() 函数的 R_SPARC_WPLT30 重定位的处理方式进行处理。此重定位是 LD 代码序列的一部分。

R_SPARC_LDO_ADD

此重定位标记 LD 代码序列中的最后一个 add 指令。包含目标文件地址(在代码序列的初始部分中计算得出)的寄存器是此指令中的第一个寄存器。此重定位允许链接编辑器标识此寄存器以进行代码变换。

R_SPARC_TLS_IE_LD

此重定位标记 32 位 IE 代码序列中的 ld 指令。此重定位用于在链接编辑时在 TLS 模型之间进行转换。

R_SPARC_TLS_IE_LDX

此重定位标记 64 位 IE 代码序列中的 ldx 指令。此重定位用于在链接编辑时在 TLS 模型之间进行转换。

R_SPARC_TLS_IE_ADD

此重定位标记 IE 代码序列中的 add 指令。用于 GOT 指针的寄存器是此序列中的第一个寄存器。