如何解决PocketBeagle2 TF-A交叉编译的PIE DT_TEXTREL链接失败?
解决TrustedFirmware-A编译“creating DT_TEXTREL in a PIE”链接错误
原因分析
GNU ld 2.46+版本强化了对PIE(位置无关可执行文件)中TEXTREL(文本段重定位)的检查,默认禁止生成带TEXTREL的PIE文件。而TI AM625对应的TrustedFirmware-A代码或编译参数未适配该严格检查规则,加上crossdev生成的aarch64交叉工具链可能默认启用了PIE相关选项,最终触发链接错误。
具体解决方法
1. 直接添加链接器参数跳过检查
在编译命令中追加LDFLAGS="--no-warn-textrel",强制链接器忽略TEXTREL的错误提示:
make CROSS_COMPILE=aarch64-unknown-linux-gnu- PLAT=k3 TARGET_BOARD=pocketbeagle2 LDFLAGS="--no-warn-textrel"
如果使用官方编译脚本,可在脚本中插入该参数覆盖默认配置。
2. 禁用交叉工具链默认的PIE选项
crossdev生成的aarch64工具链可能默认开启了-pie编译选项,可通过临时环境变量覆盖:
export CFLAGS="-fno-pie" export LDFLAGS="-no-pie" make CROSS_COMPILE=aarch64-unknown-linux-gnu- PLAT=k3 TARGET_BOARD=pocketbeagle2
也可修改工具链配置文件(通常在/usr/aarch64-unknown-linux-gnu/etc/env.d/目录下),移除默认的PIE相关编译标志。
3. 修改TF-A平台配置文件
找到TF-A的AM625平台配置文件(如plat/ti/k3/include/plat_make_helper.mk),检查是否存在强制启用PIE的配置,将其修改为禁用PIE:
# 注释或替换原PIE启用配置 # PLAT_LDFLAGS += -pie PLAT_LDFLAGS += -no-pie
4. 临时降级binutils版本(备选方案)
若以上方法均无效,可临时降级binutils到2.45版本规避严格检查:
emerge =sys-devel/binutils-2.45-r1
完成TF-A编译后,再恢复到当前的2.46.0版本即可。
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

