链接程序和库指南

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 符号的目标文件的标识符。

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