リンカーとライブラリ

32 ビット x86: Local Executable (LE)

このコードシーケンスは、「スレッド固有領域のアクセスモデル」で説明されている LE モデルを実装します。

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

コードシーケンス

初期の再配置

シンボル

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

# %eax - contains address of TLS variable
<none>
R_386_TLS_LE
 
x

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

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

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

コードシーケンス

初期の再配置

シンボル

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

# %eax - contains address of TLS variable
<none>
R_386_TLS_LE
 
x

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

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

コードシーケンス

初期の再配置

シンボル

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

# %eax - contains address of TLS variable
R_386_TLS_LE
x