このコードシーケンスは、「スレッド固有領域のアクセスモデル」で説明されている IE モデルを実装します。
表 8–20 x64: Initial Executable スレッド固有変数のアクセスコード
コードシーケンス |
初期の再配置 |
シンボル |
0x00 movq %fs:0, %rax 0x09 addq x@gottpoff(%rip), %rax # %rax - contains address of TLS variable |
<none> R_AMD64_GOTTPOFF |
x |
未処理の再配置 |
シンボル |
|
GOT[n] |
R_AMD64_TPOFF64 |
x |
シンボル x の R_AMD64_GOTTPOFF 再配置は、リンカーに GOT エントリおよび関連する R_AMD64_TPOFF64 再配置の生成を要求します。その後、この命令は x@gottpoff(%rip) 命令の最後からの GOT エントリの相対オフセットを使用します。R_AMD64_TPOFF64 再配置は、現在読み込まれているモジュールから決定されるシンボル x の値を使用します。オフセットは GOT エントリに書き込まれたあとで、addq 命令によって読み込まれます。
x のアドレスではなく x の内容を読み込む場合は、次のシーケンスを使用できます。
表 8–21 x64: Initial Executable スレッド固有変数のアクセスコード II
コードシーケンス |
初期の再配置 |
シンボル |
0x00 movq x@gottpoff(%rip), %rax 0x06 movq %fs:(%rax), %rax # %rax - contains contents of TLS variable |
R_AMD64_GOTTPOFF <none> |
x |
未処理の再配置 |
シンボル |
|
GOT[n] |
R_AMD64_TPOFF64 |
x |