R_AARCH64_ADR_PREL_PG_HI21错误源于ARM64平台要求所有参与共享库构建的代码必须为位置无关代码(PIC),而链接器发现目标文件未用-fPIC编译,导致无法安全计算全局符号(如stderr、stdin等)的页内偏移地址;解决方法是为所有源文件及第三方静态库统一添加-fPIC编译选项,并在CMake中对每个目标显式启用POSITION_INDEPENDENT_CODE属性。

relocation R_X86_64_32 against `.rodata` 怎么解决
直接加 -fPIC 编译所有参与构建共享库的源文件,不是只加在链接命令里。
这个错误说明你正在用非位置无关的目标文件(sub.o)去生成动态库(.so),而 x86_64 的 ABI 要求所有代码段必须能加载到任意地址——.rodata 是只读数据段,它的引用必须通过 GOT/PLT 间接跳转,不能硬编码 32 位绝对地址。
- 错例:
gcc -c sub.c -o sub.o→gcc -shared -o libsub.so sub.o(失败) - 正解:
gcc -c -fPIC sub.c -o sub.o→gcc -shared -o libsub.so sub.o(成功) - 如果用了静态库(
.a),里面每个.o都得是-fPIC编译的;否则链接时照样报这个错 - CMake 用户注意:
add_compile_options(-fPIC)只影响当前目录下的源,子目录或第三方库需单独设置set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
relocation truncated to fit: R_ARM_PC24 是 ARM 上什么问题
这是 ARM 指令集的分支距离限制导致的:BL/BLX 指令只有 ±4MB(Thumb)或 ±32MB(ARM)跳转范围,超出就截断报错。
常见于大函数跨段调用、或链接时把代码段和符号分得太远(比如 .text 和 .rodata 物理距离超限)。
- 最稳妥的解法是加编译选项
-mlong-calls,让编译器用 MOV+BLX 替代单条 BL,绕过 PC-relative 距离限制 - 也可尝试
-marm(强制 ARM 模式,扩大跳转范围)或调整链接脚本把相关段靠近放置 - 注意:加
-mlong-calls后每处调用多 2~3 条指令,性能略降,但功能确定 - 别指望
-O2或-fPIC能解决这个——它和位置无关性无关,纯属指令寻址能力问题
R_AARCH64_ADR_PREL_PG_HI21 在 ARM64 上为什么总出现
这不是 bug,是 ARM64 的 ADRP 指令设计使然:它只能生成 4KB 对齐页内偏移(HI21 表示高 21 位),若目标符号(如 stderr、__stack_chk_guard)离当前指令太远,就无法编码。
本质还是 PIC 缺失——但 ARM64 对 PIC 要求比 x86_64 更严格,连静态库里的对象也必须 PIC 兼容。
- 确认所有
.o和.a都用-fPIC编译(包括你依赖的第三方静态库) - 若用 CMake,对每个
add_library()目标显式设set_property(TARGET xxx PROPERTY POSITION_INDEPENDENT_CODE ON) - 避免混合链接:不要把非 PIC 的
.a和-shared一起用,哪怕它只提供数据也不行 - 某些老版本
arm-linux-gnueabihf-gcc默认不启用 PIC,必须手动加,不能依赖工具链默认行为
relocation R_X86_64_32S against `.bss` 是内存模型问题吗
是,但不是“内存不够”,而是编译器默认用 small code model,假设所有全局变量都在 2GB 地址空间内可寻址;一旦你定义了超大数组(比如 char buf[3ULL ),`.bss` 段起始地址就可能超出 32 位有符号偏移范围。
R_X86_64_32S 中的 S 就表示“有符号 32 位重定位”,链接器发现偏移值溢出就拒绝。
- 临时解法:
-mcmodel=medium(允许代码 ≤2GB,数据无限制) - 极端情况(如单个数组 >2GB):
-mcmodel=large(全地址空间自由寻址,但性能下降明显) -
-O2有时能缓解,是因为优化会折叠/复用内存,减小实际段大小——但不可靠,不能替代-mcmodel - 注意:
-mcmodel必须加在编译和链接两步,否则目标文件仍按 small model 生成,链接时照样失败
R_X86_64_32 和 R_X86_64_32S,往往意味着既缺 -fPIC,又越界了 -mcmodel 限制。这时候得先 fix PIC,再看是否还需调模型。


















