次の表に、SPARC 用に定義された TLS 再配置を示します。この表の説明は、次の表記規則を使用しています。
TLS_index 構造体を保持するために、大域オフセットテーブル内に連続した 2 つのエントリを割り当てます。この情報は、__tls_get_addr() に渡されます。このエントリを参照する命令は、2 つの GOT エントリのうちの最初のエントリのアドレスに結合されます。
TLS_index 構造体を保持するために、大域オフセットテーブル内に連続した 2 つのエントリを割り当てます。この情報は、__tls_get_addr() に渡されます。この構造体の ti_tlsoffset フィールドは 0 に設定され、ti_moduleid は実行時に埋め込まれます。__tls_get_addr() 呼び出しは、動的な TLS ブロックの開始オフセットを返します。
TLS ブロックからの相対 tlsoffset を計算します。
静的な TLS ブロックからの負の相対 tlsoffset を計算します。この値は、TLS アドレスを計算するためにスレッドポインタに追加されます。
シンボル S を含むオブジェクトの識別子を計算します。
名前 |
値 |
フィールド |
計算 |
---|---|---|---|
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) |
いくつかの再配置型には、単純な計算を超えた意味が存在します。
この再配置は、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 ポインタに使用されるレジスタは、シーケンス内の最初のレジスタです。