编译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
相关产品推荐
相关产品推荐

