本篇基于<<AMD64(x86_64)架构abi文档:中>>延伸章节。
10.3.2 静态线程局部变量
10.3.3 TLS链接器优化
10.4 内核支持
10.5 编码示例
10.5.1 间接分支
11 备用代码序列的安全性
11.1 没有PLT的代码序列
11.1.1 通过GOT槽间接呼叫
11.1.2 没有PLT的线程本地存储
12 英特尔MPX扩展
12.1 参数传递和返回值
12.1.1 归类
12.1.2 通过
12.1.3 返回值
12.1.4 变量参数列表
12.2 程序加载和动态链接
附录A
A.1 32位程序的执行
A.2 AMD64 Linux内核约定
A.2.1 调用约定
A.2.2 堆栈布局
A.2.3 其他评述
附录B
B.1 合并GOTPLT和GOT插槽
B.2 优化GOTPCRELX重新定位
目录预览
10.3.2 静态线程局部变量
对于静态线程局部变量x:
static __thread int x;
本地动态模型将x的地址加载到%rax中
or
对于具有TLSDESC的代码序列,局部动态模型与一般动态模型相似。同样的编码要求也适用于法律指令。
局部动态模型,加载值x到%edi
本地Exec模型加载x到%rax的地址
or
本地执行模型,II装载x到%edi的值
本地执行模型,III装载x到%edi的值
10.3.3 TLS链接器优化
General Dynamic To Initial Exec加载x到%rax的地址