ZHCADC4A September 2011 – March 2014
在初始可执行文件模型中,线程局部变量的访问方式如下:
callp __c6xabi_get_tp() ;Returns TP in A4; Can be CSEed
LDW *+DP($GOT_TPR_byte(x)), A5 ;reloc R_C6000_SBR_GOT_U15_W_TPR_B
LDB *A4[A5], B4 ;
LDW *+DP($GOT_TPR_hword(x)), A5 ;reloc R_C6000_SBR_GOT_U15_W_TPR_H
LDH *A4[A5], B4 ;
LDW *+DP($GOT_TPR_word(x)), A5 ;reloc R_C6000_SBR_GOT_U15_W_TPR_W
LDW *A4[A5], B4 ;
LDW *+DP($GOT_TPR_dword(x)), A5 ;reloc R_C6000_SBR_GOT_U15_W_TPR_D
LDDW *A4[A5], B4 ;
重定位 R_C6000_SBR_GOT_U15_W_TPR_[B|H|W] 使得链接器为 x 的 TPR 偏移量创建一个 GOT 条目:
GOT[m] ;reloc R_C6000_TPR_U32_B (symbol x)
GOT[n] ;reloc R_C6000_TPR_U32_H (symbol y)
GOT[o] ;reloc R_C6000_TPR_U32_W (symbol z)
GOT[p] ;reloc R_C6000_TPR_U32_D (symbol z)
_TPR_U32_[B|H|W|DW] 重定位由动态加载器以线程指针的偏移量 x 来解析。这些重定位根据访问宽度进行缩放。
如果必须使用 far DP 寻址来访问 GOT,则序列如下:
callp __c6xabi_get_tp() ;Returns TP in A4; Can be CSEed
MVKL $DPR_GOT_TPR_byte(x), A5 ;reloc R_C6000_SBR_GOT_L16_W_TPR_B
MVKH $DPR_GOT_TPR_byte(x), A5 ;reloc R_C6000_SBR_GOT_H16_W_TPR_B
ADD DP, A5, A5
LDW *A5, A5
LDB *A4[A5], A6
MVKL $DPR_GOT_TPR_hword(x), A5 ;reloc R_C6000_SBR_GOT_L16_W_TPR_H
MVKH $DPR_GOT_TPR_hword(x), A5 ;reloc R_C6000_SBR_GOT_H16_W_TPR_H
ADD DP, A5, A5
LDW *A5, A5
LDH *A4[A5], A6
MVKL $DPR_GOT_TPR_word(x), A5 ;reloc R_C6000_SBR_GOT_L16_W_TPR_W
MVKH $DPR_GOT_TPR_word(x), A5 ;reloc R_C6000_SBR_GOT_H16_W_TPR_W
ADD DP, A5, A5
LDW *A5, A5
LDW *A4[A5], A6
MVKL $DPR_GOT_TPR_dword(x), A5 ;reloc R_C6000_SBR_GOT_L16_W_TPR_D
MVKH $DPR_GOT_TPR_dword(x), A5 ;reloc R_C6000_SBR_GOT_H16_W_TPR_D
ADD DP, A5, A5
LDW *A5, A5
LDDW *A4[A5], A6