此代码序列实现线程局部存储的访问模型中介绍的 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 |
符号 x 的 R_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 |