链接程序和库指南

x64: 初始可执行 (Initial Executable, IE)

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

表 8–20 x64: 初始可执行的线程局部变量的访问代码

代码序列

初始重定位

符号

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

符号 xR_AMD64_GOTTPOFF 重定位请求链接编辑器生成 GOT 项和关联的 R_AMD64_TPOFF64 重定位。然后,x@gottpoff(%rip) 指令使用 GOT 项相对于此指令结束位置的偏移。R_AMD64_TPOFF64 重定位使用根据目前所装入模块确定的符号 x 的值。偏移将写入到 GOT 项中,然后由 addq 指令装入。

要装入 x 的内容(而不是 x 的地址),可使用以下序列。

表 8–21 x64: 初始可执行的线程局部变量的访问代码 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