ARM7a无立即数BX分支指令,链接器如何处理Thumb分支?
ARM7a链接器处理ARM到Thumb分支的方案
优先用BLX直接替换:如果目标Thumb符号的相对偏移在BLX指令的立即数覆盖范围(ARM7a支持±32MB)内,链接器会直接把原BL指令替换成BLX指令。BLX本身支持相对分支,还能自动切换到Thumb状态,完美匹配全局符号bit0置位的互操作场景,这是最高效的处理方式。
超出偏移范围时自动生成优化后的Veneer:当目标地址超出BLX的偏移限制,链接器会自动生成你提到的那种跳转代码,但会做针对性优化:
- 将Veneer放置在靠近调用点的代码段,缩短PC相对加载的偏移长度
- 复用Veneer:多个调用点指向同一远地址时,共享同一段Veneer代码,减少冗余
- 选用调用者保存的寄存器(比如r12/IP寄存器)而非r0,避免破坏调用者的寄存器状态
静态链接阶段提前处理符号:在静态链接时,链接器会预先扫描所有全局符号的bit0标记,对每个ARM到Thumb的分支调用自动判断处理方式——能直接用BLX就替换,不行就插入Veneer,全程不需要开发者手动干预。
内容的提问来源于stack exchange,提问作者progman
相关产品推荐
相关产品推荐

