SPARC: スレッド固有ストレージの再配置のタイプ
次の表に、SPARC 用に定義された TLS 再配置を示します。表内の説明では、次の表記が使用されています。
- @dtlndx(x)
TLS_index 構造体を保持するために、GOT 内に連続した 2 つのエントリを割り当てます。この情報は、__tls_get_addr() に渡されます。このエントリを参照する命令は、2 つの GOT エントリのうちの最初のエントリのアドレスに結合されます。
- @tmndx(x)
TLS_index 構造体を保持するために、GOT 内に連続した 2 つのエントリを割り当てます。この情報は、__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 ポインタに使用されるレジスタは、シーケンス内の最初のレジスタです。