ZHCADC4A September 2011 – March 2014
如果函数可以被抢占,则函数的地址无法在 PLT 条目中编码,即使以与位置无关的方式编码也是如此。此地址必须通过 GOT 间接寻址。
$sym$plt:
LDW *+DP($GOT(sym)),tmp ;reloc R_C6000_SBR_GOT_U15
B tmp
某些编译器辅助函数遵循非标准寄存器保留约定(节 8.3),这会影响选择将哪个寄存器用于 tmp。此外,除 PLT 条目直接提及的寄存器外,延迟绑定(节 15.6)可能会影响其他寄存器。因此,ABI 规定不能导入遵循非标准约定的函数;也就是说,这些函数不能通过 PLT 条目调用。根据此规定,链接器可以随时修改 PLT 条目中的函数调用接口未涉及的任何调用者保存寄存器。
编译器可以选择内联 PLT 条目,以调用它已知或怀疑已导入的函数。这样做的好处是可以减少附加分支的延迟,但会增加代码量。
如果动态加载器使用节 15.6所述的延迟绑定,则内联 PLT 条目必须遵循其中所述的约定。或者,内联 PLT 可以生成动态重定位表的 DT_JMPREL 部分中未包括的 GOT 重定位(请参阅 System V ABI 第 5 章的动态段),以免其受到延迟绑定的影响。