リンカーとライブラリ

SPARC: スレッド固有領域の再配置のタイプ

次の表に、SPARC 用に定義された TLS 再配置を示します。この表の説明は、次の表記規則を使用しています。

@dtlndx(x)

TLS_index 構造体を保持するために、大域オフセットテーブル内に連続した 2 つのエントリを割り当てます。この情報は、__tls_get_addr() に渡されます。このエントリを参照する命令は、2 つの GOT エントリのうちの最初のエントリのアドレスに結合されます。

@tmndx(x)

TLS_index 構造体を保持するために、大域オフセットテーブル内に連続した 2 つのエントリを割り当てます。この情報は、__tls_get_addr() に渡されます。この構造体の ti_tlsoffset フィールドは 0 に設定され、ti_moduleid は実行時に埋め込まれます。__tls_get_addr() 呼び出しは、動的な TLS ブロックの開始オフセットを返します。

@dtpoff(x)

TLS ブロックからの相対 tlsoffset を計算します。

@tpoff(x)

静的な TLS ブロックからの負の相対 tlsoffset を計算します。この値は、TLS アドレスを計算するためにスレッドポインタに追加されます。

@dtpmod(x)

シンボル S を含むオブジェクトの識別子を計算します。

表 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_ADD を参照

R_SPARC_TLS_GD_CALL

59

V-disp30

R_SPARC_TLS_GD_CALL を参照

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_ADD を参照

R_SPARC_TLS_LDM_CALL

63

V-disp30

R_SPARC_TLS_LDM_CALL を参照

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_LDO_ADD を参照

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_LD を参照

R_SPARC_TLS_IE_LDX

70

なし 

R_SPARC_TLS_IE_LDX を参照

R_SPARC_TLS_IE_ADD

71

なし 

R_SPARC_TLS_IE_ADD を参照

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 ポインタに使用されるレジスタは、シーケンス内の最初のレジスタです。