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 指针的寄存器是此序列中的第一个寄存器。