ZHCADC4A September 2011 – March 2014
就静态可执行文件 TLS 模型而言,线程局部访问代码与 Linux 本地可执行文件模型(节 7.5.1.4)相同。至于静态可执行文件,不存在线程控制块 (TCB),因此 TPR 偏移与 TLS 块基本相对地址相同。
理想情况下,我们可以为该情况生成 TBR 寻址。但是,编译器选项可用来使用裸机动态链接模型进行构建,这需要 TCB。因此,我们为静态可执行文件模型生成 TPR 寻址,如下所示:
CALLP __c6xabi_get_tp() ; Returns TP in A4. Can be CSEed.
MVK $TPR_byte(x), B4 ; reloc R_C6000_TPR_U15_B
LDB *A4[B4], A4 ; A4 contains the value of thread-local char x
MVK $TPR_hword(y), B4 ; reloc R_C6000_TPR_U15_H
LDH *A4[B4], A4 ; A4 contains the value of thread-local short y
MVK $TPR_word(z), B4 ; reloc R_C6000_TPR_U15_W
LDW *A4[B4], A4 ; A4 contains the value of thread-local int z
MVK $TPR_dword(l), B4 ; reloc R_C6000_TPR_U15_D
LDDW *A4[B4], A7:A6 ; A4 contains the value of thread-local int l
TPR 重定位由静态链接器使用可执行文件 TLS 块中变量的偏移进行解析。如果 TLS 块预计大于 32KB,则可以使用 far TPR 重定位。