## 软件工具链中的长跳转问题 大多数计算机架构限制了单个分支指令可达的距离。当函数调用或跳转超过此范围(例如,在AArch64上调用距离超过128MB的函数时),工具链必须采用策略以确保正确执行。这涉及编译器、汇编器和链接器的协同工作。 **编译器**处理函数内部过远的跳转,通常通过反转条件并添加无条件跳转来实现。**汇编器**根据已知节内的距离优化指令编码。然而,**链接器**面临着最复杂的任务,它需要解析跨节和目标文件中的跳转,而这些距离在最终布局确定之前是未知的。 当跳转仍然超出范围时,链接器会生成**范围扩展跳转(thunk)**——作为中间媒介的小段代码,以到达目标位置。像RISC-V这样的架构提供**链接器放松(linker relaxation)**,在可能的情况下*缩小*指令序列,优化代码大小。 不同的架构具有不同的分支范围限制(AArch64:±128MiB,RISC-V:`jal`的±1MiB),这会影响thunk生成的频率。像lld/ELF和mold这样的链接器采用不同的算法来创建thunk,以平衡复杂性和效率。诊断“超出范围的重定位”错误涉及检查链接器输出、映射文件,并考虑函数节划分和链接时优化等因素。