リンカーとライブラリ

x86: Local Executable (LE)

このコードシーケンスは、動的実行可能ファイル内から、同じファイル内で定義された TLS 変数を参照するためにのみ使用できます。この場合、静的な tlsoffset はリンク編集時に認識され、実行時の再配置は不要です。

表 8–14 x86: Local Executable スレッド固有変数のアクセスコード

コードシーケンス 

初期の再配置 

シンボル 

0x00 movl %gs:0, %eax
0x06 leal x@ntpoff(%eax), %eax

# %eax - TLS 変数のアドレスが含まれる
<なし>
R_386_TLS_LE
 
x

movl 命令は、R_386_TLS_LE_32 再配置を生成します。リンカーは、実行可能ファイルで定義されたシンボルの静的な TLS オフセットに、この再配置を直接結合します。実行時には処理は不要です。

次の命令シーケンスを使用すると、同じ再配置により変数 x の (アドレスではなく) 内容にアクセスできます。

表 8–15 x86: Local Executable スレッド固有変数のアクセスコード

コードシーケンス 

初期の再配置 

シンボル 

0x00 movl %gs:0, %eax
0x06 movl x@ntpoff(%eax), %eax

# %eax - TLS 変数のアドレスが含まれる
<なし>
R_386_TLS_LE
 
x

変数のアドレスを計算するのではなく、その変数から読み込むかあるいはその変数に保存したいという場合は、次のシーケンスを使用できます。この例では、x@ntpoff による式を即値としてではなく絶対アドレスとして使用しています。

表 8–16 x86: Local Executable スレッド固有変数のアクセスコード

コードシーケンス 

初期の再配置 

シンボル 

0x00 movl %gs:x@ntpoff, %eax

# %eax - TLS 変数のアドレスが含まれる
R_386_TLS_LE
x