链接程序和库指南

32 位 x86: 常规动态 (General Dynamic, GD)

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

表 8–8 32 位 x86: 常规动态线程局部变量的访问代码

代码序列

初始重定位

符号

0x00 leal  x@tlsgd(,%ebx,1), %eax

0x07 call  x@tlsgdplt



# %eax - contains address of TLS variable
R_386_TLS_GD

R_386_TLS_GD_PLT
x

x
 

未完成的重定位

符号

GOT[n]

GOT[n + 1]
R_386_TLS_DTPMOD32

R_386_TLS_DTPOFF32
x

leal 指令生成 R_386_TLS_GD 重定位,此重定位指示链接编辑器在 GOT 中分配空间,以存储变量 xTLS_index 结构。链接编辑器通过将相对于 GOT 的偏移替换为新的 GOT 项来处理此重定位。

由于在运行前无法确定 x 的装入目标文件索引和 TLS 块索引,因此链接编辑器将根据 GOT 放置 R_386_TLS_DTPMOD32R_386_TLS_DTPOFF32 重定位,以便运行时链接程序处理。生成的 GOT 项的地址将装入寄存器 %eax 中以便调用 ___tls_get_addr()

call 指令导致生成 R_386_TLS_GD_PLT 重定位。此重定位指示链接编辑器将调用绑定到 ___tls_get_addr() 函数,并将 call 指令与 GD 代码序列关联。

call 指令必须紧跟在 leal 指令后面。要允许进行代码变换,必须满足此要求。