ZHCADC4A September 2011 – March 2014
这是初始可执行文件模型的优化。创建程序的初始 TLS 映像(通常称为静态 TLS 映像)时,TLS 块始终放置在线程指针的已知偏移量处。通常情况下,这是线程控制块 (TCB) 加上 TLS 块基址偏移量。因此,可执行文件的自带线程局部变量具有线程指针相对偏移量,该偏移量是静态链接时常量。在这种情况下,可使用内联常量偏移量来访问线程局部变量;无需 GOT 条目。使用该访问模型的对象不能用于构建动态库。
CALLP __c6xabi_get_tp() ; Returns TP in A4. Can be CSEed.
MVK $TPR_byte(x), A5 ; reloc R_C6000_TPR_U15_B
LDB *A4[A5], A4 ; A4 contains the value of thread-local char x
MVK $TPR_hword(y), A5 ; reloc R_C6000_TPR_U15_H
LDH *A4[A5], A4 ; A4 contains the value of thread-local short y
MVK $TPR_word(z), A5 ; reloc R_C6000_TPR_U15_W
LDW *A4[A5], A4 ; A4 contains the value of thread-local int z
MVK $TPR_dword(l), A5 ; reloc R_C6000_TPR_U15_D
LDDW *A4[A5], A7:A6 ; A7:A6 contains the value of thread-local long long l
TPR_U15 重定位对 15 位无符号 TPR 偏移量(TP 指向地址的偏移量)进行编码,以便实现 near TPR 寻址。重定位根据访问宽度进行缩放。前面的寻址可访问大小为 32KB 的 TLS 块。本规范将总静态 TLS 的大小限制为 32KB,因为预计这一限制足以满足大多数用例。因此,未定义 far TPR 地址。可定义 far TBR 寻址,但这样做最多会使用 8 个新的重定位,最好是保留 ELF 允许的有限重定位数量 (256)。