AArch64裸机程序relocation truncated to fit错误排查求助
问题分析与解决
错误原因
这个重定位错误不是链接脚本未指定内存大小导致的,核心问题在于:
R_AARCH64_ADR_PREL_PG_HI21是AArch64中生成基于页的相对地址的重定位类型,它依赖ADR指令,而ADR的有效寻址范围仅为当前PC的±4GB区间。- 你的
axpu_kernel_binary位于0x100a00000(即4GB+0xa00000),和代码段(.text.startup)的地址差已经超出4GB,突破了ADR指令的寻址上限,导致重定位时无法将完整地址塞进指令的有限位宽,触发截断错误。
解决方法
1. 强制使用64位绝对寻址
修改代码,引导编译器生成支持全64位地址的加载指令(如LDR),替代依赖相对寻址的ADR:
#include <stdint.h> // 显式转换为64位地址后再传递给printf uint64_t kernel_addr = (uint64_t)&axpu_kernel_binary; printf("axpu_kernel_binary = %p, axpu_kernel_binary_len = %x\n", (void*)kernel_addr, axpu_kernel_binary_len);
2. 调整段地址布局
如果硬件允许,修改链接脚本,将.axpudata_kernel_binary段迁移到和代码段(.text)同一个4GB地址范围内。比如把数据段地址改为0x80a00000,只要和代码段的地址差不超过4GB,ADR指令就能正常完成寻址。
3. 确认编译模式
检查编译选项,确保没有误启用32位模式(如-m32),AArch64默认是64位模式,但错误选项会导致地址处理逻辑异常。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

