链接程序和库指南

32 位 x86: 局部可执行 (Local Executable, LE)

此代码序列实现线程局部存储的访问模型中介绍的 LE 模型。

表 8–14 32 位 x86: 局部可执行的线程局部变量的访问代码

代码序列

初始重定位

符号

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: 局部可执行的线程局部变量的访问代码

代码序列

初始重定位

符号

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: 局部可执行的线程局部变量的访问代码

代码序列

初始重定位

符号

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



# %eax - contains address of TLS variable
R_386_TLS_LE
x