relocation out of range本质是链接器指令编码范围不足导致“够不着”目标地址,如AArch64的adrp+add限±4GB、x86-64 call/jmp限±2GB;常见于静态链接巨型库、模板爆炸或段布局不当。

错误本质:不是代码写错了,是链接器“够不着”目标地址
relocation out of range 是 LLD 在生成最终可执行文件或共享库时,发现某条重定位指令(比如跳转、取地址)的目标符号离得太远,超出了当前指令编码能表示的范围。典型如 AArch64 的 adrp+add 组合只支持 ±4GB 偏移,x86-64 的 call/jmp 相对寻址只有 ±2GB;一旦代码段或数据段被拉得过长(尤其在大型静态链接场景),就容易触发。
快速定位哪个 .o 文件/符号引发问题
LLD 默认报错只给文件名和函数名,但不指明具体哪条重定位失败。需加参数让其暴露细节:
- 用
-Wl,--fatal-warnings防止忽略警告升级为错误后掩盖线索 - 加
-Wl,--verbose或-Wl,--trace-symbol=xxx(替换xxx为疑似问题符号)观察链接过程中的符号解析路径 - 最有效的是导出重定位信息:
llvm-readobj -r path/to/bad.o,再 grep 搜索R_AARCH64_ADR_PREL_PG_HI21或R_X86_64_PLT32等高风险类型,结合llvm-objdump -d查看对应指令附近的调用目标 - 若使用 CMake,可在
target_link_options中临时加入$<-wl></-wl>

















