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

编译ARM二进制文件时无法禁用-pie,编译行同时存在冲突选项

解决ARM交叉编译中-fno-pie与-pie共存的链接错误

这不是make的问题,核心原因是Trusted Firmware-A(TFA)的构建系统默认已经启用了PIE(位置无关可执行文件)编译选项,你在命令行传入的CFLAGS=-fno-pie和LDFLAGS=-no-pie是追加到原有编译/链接选项之后,而非覆盖,最终导致命令行中同时出现冲突选项,引发链接报错。

解决方法

1. 优先使用TFA官方配置开关(推荐)

多数嵌入式固件构建系统会提供专门的变量来控制PIE功能,先检查TFA的顶层Makefile或文档,看是否存在类似ENABLE_PIE的开关。如果有,直接在命令行禁用:

make V=1 -C ./$TFA -j4 CROSS_COMPILE=$CC64 \
    ENABLE_PIE=0 ARCH=aarch64 \
    PLAT=k3 SPD=opteed K3_USART=0x6 \
    BL32_BASE=0x80080000 \
    PRELOADED_BL33_BASE=0x82000000 \
    TARGET_BOARD=${tfa_board} all

这种方式最稳妥,不会破坏原有编译选项的完整性。

2. 强制覆盖CFLAGS/LDFLAGS变量

如果没有官方开关,可以用Make的变量赋值语法:=强制覆盖原有变量,替换掉所有默认编译选项(注意:此方法会丢失TFA原Makefile中定义的其他CFLAGS/LDFLAGS选项,若需要保留,需手动追加必要选项):

make V=1 -C ./$TFA -j4 CROSS_COMPILE=$CC64 \
    CFLAGS:=-fno-pie LDFLAGS:=-no-pie ARCH=aarch64 \
    PLAT=k3 SPD=opteed K3_USART=0x6 \
    BL32_BASE=0x80080000 \
    PRELOADED_BL33_BASE=0x82000000 \
    TARGET_BOARD=${tfa_board} all

3. 过滤冲突选项后追加新选项

如果需要保留TFA原有的编译选项,仅移除冲突的PIE相关参数,可以用Make的filter-out函数过滤后再追加:

make V=1 -C ./$TFA -j4 CROSS_COMPILE=$CC64 \
    CFLAGS='$(filter-out -pie -fpie,$(CFLAGS)) -fno-pie' \
    LDFLAGS='$(filter-out -pie,$(LDFLAGS)) -no-pie' \
    ARCH=aarch64 PLAT=k3 SPD=opteed K3_USART=0x6 \
    BL32_BASE=0x80080000 PRELOADED_BL33_BASE=0x82000000 \
    TARGET_BOARD=${tfa_board} all

该命令会先清除原有CFLAGS中的-pie/-fpie、LDFLAGS中的-pie,再添加禁用PIE的选项,避免冲突。

内容的提问来源于stack exchange,提问作者Ender

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:13:15