U-boot交叉编译疑问:为何未选用指定的工具链?
编译旧版U-boot未使用指定外部工具链的排查方案
问题背景
编译旧版本U-boot(2012.10)时,指定使用ARM架构的uClibc-ng外部工具链,执行的编译命令如下:
PATH='/home/build/src/build/x-tools/armv7a-g4.9.2-lnx3.2.69-uClibc-ng-1.0.22/install/arm-onie-linux-uclibcgnueabi/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' make CROSS_COMPILE=arm-onie-linux-uclibcgnueabi-
编译完成后发现未使用指定的外部工具链,通过在U-boot Makefile中添加以下代码验证了这一点:
+GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') +ifeq "$(GCCVERSION)" "7.5.0" +$(error *** IT DOES NOT SEEM LIKE YOU ARE USING CROSS-COMPILER TOOLCHAIN! ***) +endif
日志显示编译过程未使用CROSS_COMPILE前缀,尝试将PATH和CROSS_COMPILE导出为环境变量后问题仍未解决,编译环境为Ubuntu 18.04的Docker容器。
排查方向及解决方法
- 检查Makefile工具调用是否硬编码:旧版U-boot(2012.10)的Makefile可能存在直接调用
gcc、ld等原生工具的情况,而非使用$(CROSS_COMPILE)gcc格式。搜索Makefile中所有直接调用编译工具的地方,替换为带前缀的形式。 - 验证工具链命名匹配性:确认工具链
bin目录下的编译器名称是否为arm-onie-linux-uclibcgnueabi-gcc。进入工具链路径执行ls arm-onie-linux-uclibcgnueabi-*,如果工具名称与CROSS_COMPILE前缀拼接后不匹配,会导致无法调用到正确的交叉编译器。 - 强制指定工具链绝对路径:Docker容器中系统自带的gcc(7.5.0)可能优先级更高,即使调整
PATH也无法覆盖。直接使用绝对路径指定交叉编译器前缀,绕过PATH查找:make CROSS_COMPILE=/home/build/src/build/x-tools/armv7a-g4.9.2-lnx3.2.69-uClibc-ng-1.0.22/install/arm-onie-linux-uclibcgnueabi/bin/arm-onie-linux-uclibcgnueabi- - 排查Makefile变量覆盖:旧版U-boot的Makefile可能在后续逻辑中重新定义了
CROSS_COMPILE变量,覆盖了命令行传入的值。搜索Makefile中所有CROSS_COMPILE =的赋值语句,确认是否存在未预期的变量覆盖。 - 彻底清理残留构建文件:之前使用系统gcc编译产生的中间文件可能干扰新构建,执行
make distclean完全清理后再重新执行编译命令。
内容的提问来源于stack exchange,提问作者zbro
相关产品推荐
相关产品推荐

