You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:48:10