ZHCADC4A September 2011 – March 2014
弱函数是自身符号具有绑定 STB_WEAK 的函数。在不定义弱函数的情况下,程序可以成功链接,使对它的引用保持不解析状态。
链接器以不同方式处理未解析的弱函数调用,具体取决于使用静态链接还是动态链接。
使用静态链接时,链接器会将对未定义弱函数的调用替换为实际上的 NOP。但为了实现优化,比如被调用者不返回调用点的尾调用消除,替换必须保留调用行为的某些方面。因此,不使用 NOP 进行替代,而是使用替代返回指令:
B.S2 B3 ; replacement for unresolved weak call
这种行为对弱函数调用提出了以下额外要求:
ABI 支持调用导入的弱函数;也就是可能在其他不同静态链接单元中定义的函数。
使用动态链接时,全局偏移表 (GOT) 用于确定要使未解析的弱函数保留 0 值,还是在 _ _c6xabi_weak_return() 的地址中进行修补,后者会直接返回到其调用者。如果使用 0 值(对于 Linux 平台),则需要保护。如果使用 _ _c6xabi_weak_return() 函数(对于裸机平台),则不需要保护。