リンカーとライブラリ

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

次の表に、x64 用に定義された TLS 再配置を示します。表内の説明では、次の表記が使用されています。

@tlsgd(%rip)

TLS_index 構造体を保持するために、GOT 内に連続した 2 つのエントリを割り当てます。この構造体は、__tls_get_addr() に渡されます。この命令は、正確で一般的な動的コードシーケンス内でのみ使用できます。

@tlsld(%rip)

TLS_index 構造体を保持するために、GOT 内に連続した 2 つのエントリを割り当てます。この構造体は、__tls_get_addr() に渡されます。実行時、オブジェクトの ti_offset オフセットフィールドは ゼロに設定され、ti_module オフセットは初期化されます。__tls_get_addr() 関数の呼び出しは、動的な TLS ブロックの開始オフセットを返します。この命令は、正確なコードシーケンス内で使用できます。

@dtpoff

変数を含む TLS ブロックの最初からの変数の相対オフセットを計算します。計算値は加数の即値として使用され、特定のレジスタには関連付けられません。

@dtpmod(x)

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

@gottpoff(%rip)

最初の TLS ブロック内の変数のオフセットを保持する GOT 内のエントリを割り当てます。このオフセットは TLS ブロックの端、%fs:0 から計算されます。この演算子は、movq または addq 命令とだけ使用できます。

@tpoff(x)

TLS ブロックの端、%fs:0 からの変数の相対オフセットを計算します。GOT エントリは作成されません。

表 8–25 x64: スレッド固有領域の再配置のタイプ

名前 

値 

フィールド 

計算 

R_AMD64_DPTMOD64

16

Word64

@dtpmod(s)

R_AMD64_DTPOFF64

17

Word64

@dtpoff(s)

R_AMD64_TPOFF64

18

Word64

@tpoff(s)

R_AMD64_TLSGD

19

Word32

@tlsgd(s)

R_AMD64_TLSLD

20

Word32

@tlsld(s)

R_AMD64_DTPOFF32

21

Word32

@dtpoff(s)

R_AMD64_GOTTPOFF

22

Word32

@gottpoff(s)

R_AMD64_TPOFF32

23

Word32

@gottpoff(s)