Ubuntu 14.04下交叉编译GCC 4.8.2时configure脚本执行失败
问题背景
我已经折腾好几天了,目标是交叉编译GCC 4.8.2,用来给大端MIPS系统编译旧版本的strace。我跟着一份交叉编译指南一步步来,前面的步骤都没问题,但到了结合newlib重建GCC的环节,直接报错卡壳了。
错误输出
checking for mips-linux-gnu-gcc... /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include
checking for suffix of object files... configure: error: in/opt/cross/gcc-build/mips-linux-gnu/libgcc': configure: error: cannot compute suffix of object files: cannot compile Seeconfig.log' for more details.
make[1]: *** [configure-target-libgcc] Error 1
make[1]: Leaving directory `/opt/cross/gcc-build'
make: *** [all] Error 2
config.log关键摘录
Configured with: ../gcc-4.8.2/configure --target=mips-linux-gnu --prefix=/opt/cross/gcc-mips --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-multilib --with-newlib Thread model: posix gcc version 4.8.2 (GCC) configure:3358: $? = 0 configure:3347: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -V >&5 xgcc: error: unrecognized command line option '-V' xgcc: fatal error: no input files compilation terminated. configure:3358: $? = 1 configure:3347: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -qversion >&5 xgcc: error: unrecognized command line option '-qversion' xgcc: fatal error: no input files compilation terminated. configure:3358: $? = 1 configure:3374: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -o conftest -g -O2 -Wno-error -minterlink-mips16 conftest.c >&5 /opt/cross/gcc-build/./gcc/as: 87: exec: -EB: not found configure:3377: $? = 1 configure:3565: checking for suffix of object files configure:3587: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -c -g -O2 -Wno-error -minterlink-mips16 conftest.c >&5 /opt/cross/gcc-build/./gcc/as: 87: exec: -EB: not found configure:3591: $? = 1 configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "GNU C Runtime Library" | #define PACKAGE_TARNAME "libgcc" | #define PACKAGE_VERSION "1.0" | #define PACKAGE_STRING "GNU C Runtime Library 1.0" | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "http://www.gnu.org/software/libgcc/" | /* end confdefs.h. */ | | int | main () | { | | ; | return 0; | } configure:3605: error: in `/opt/cross/gcc-build/mips-linux-gnu/libgcc': configure:3608: error: cannot compute suffix of object files: cannot compile See `config.log' for more details.
我的初步分析
我打开了/opt/cross/gcc-build/gcc/as脚本,第87行是exec $original ${1+"$@"}。错误提示exec: -EB: not found,这明显是$original变量是空的,导致exec直接把-EB当成要执行的命令了。我试过手动把$original设成/opt/cross/gcc-build/./gcc/xgcc之类的路径,但都没搞定。查了一圈帖子,好像没人碰到过这个特定的变量为空的问题,实在没辙了,来求助!
解决方案
这个问题的核心是GCC构建过程中生成的as包装脚本没正确设置$original变量,导致它找不到真正的交叉汇编器。下面是一步步的解决办法:
1. 先确认交叉汇编器是否安装正确
首先得确保你已经编译并安装了针对大端MIPS的GNU汇编器(mips-linux-gnu-as),它应该在你的交叉工具链前缀目录下,比如/opt/cross/gcc-mips/bin/mips-linux-gnu-as。
如果还没装,先编译binutils(建议选和GCC 4.8.2兼容的版本,比如binutils 2.23.2):
mkdir binutils-build && cd binutils-build ../binutils-2.23.2/configure --target=mips-linux-gnu --prefix=/opt/cross/gcc-mips --with-gnu-as --with-gnu-ld make && make install
2. 手动修复as脚本里的$original变量
打开/opt/cross/gcc-build/gcc/as脚本,找到$original的定义位置(一般在脚本开头),把它改成正确的交叉汇编器路径:
# 把原来的定义替换成这个路径 original="/opt/cross/gcc-mips/bin/mips-linux-gnu-as"
保存后重新运行make试试。
3. 检查环境变量和配置参数
另外还要确保:
PATH环境变量里包含/opt/cross/gcc-mips/bin,这样构建系统能找到交叉工具链- 重新检查GCC的configure命令,确保
--with-gnu-as参数指向正确的汇编器,或者干脆移除这个参数让系统自动检测
4. 备选:彻底清理后重新构建
如果上面的方法都没用,那就把构建目录彻底清干净,从头再来:
cd /opt/cross/gcc-build make distclean ../gcc-4.8.2/configure --target=mips-linux-gnu --prefix=/opt/cross/gcc-mips --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-multilib --with-newlib make
内容的提问来源于stack exchange,提问作者exclamationmark

