在amd64平台编译可运行于i686的MIPS目标gcc与binutils的配置问题
解决在amd64机器上编译可在i686运行的MIPS交叉GCC工具链问题
你的问题核心在于混淆了编译流程中三个关键架构的配置,以及没有针对性地分离"编译辅助工具"和"最终交叉工具链"的编译参数。下面是分步解决方法:
1. 先补全i686编译环境依赖
你之前遇到--host=i686-linux-gnu提示缺少工具,是因为系统没有安装32位编译所需的头文件、库和交叉工具。在Debian/Ubuntu系执行以下命令:
sudo apt update sudo apt install gcc-multilib g++-multilib libc6-dev-i386 binutils-i686-linux-gnu lib32gcc-s1 lib32stdc++6
这些包会提供i686架构编译的基础依赖,确保configure能识别i686-linux-gnu作为host目标。
2. 正确编译Binutils(先做这一步,GCC依赖Binutils)
使用三架构明确指定的方式配置,同时强制所有针对host的编译为32位:
# 建议使用out-of-tree编译,避免污染源码 mkdir -p build-binutils-i686-mips && cd build-binutils-i686-mips ../binutils-<版本号>/configure \ --build=x86_64-linux-gnu \ # 当前编译机器的架构(你的amd64) --host=i686-linux-gnu \ # 工具链将要运行的目标架构(i686) --target=mips-linux-gnu \ # 工具链编译的程序目标架构(MIPS) --prefix=/usr/local/i686-mips-toolchain \ # 工具链安装路径 CFLAGS="-m32" \ CXXFLAGS="-m32" \ LDFLAGS="-m32" # 编译并安装 make -j$(nproc) sudo make install
3. 关键:正确配置GCC编译参数
你之前的链接错误,是因为直接加CFLAGS=-m32会让GCC编译运行在当前amd64机器上的辅助工具(比如genconstants)也强制用32位,但这些工具依赖的libiberty.a是64位编译的,导致架构冲突。
解决方法是用GCC专门的*_FOR_HOST参数,只针对最终要在i686运行的交叉工具链启用32位编译,而辅助工具仍用当前amd64架构编译:
mkdir -p build-gcc-i686-mips && cd build-gcc-i686-mips ../gcc-<版本号>/configure \ --build=x86_64-linux-gnu \ --host=i686-linux-gnu \ --target=mips-linux-gnu \ --prefix=/usr/local/i686-mips-toolchain \ --with-binutils=/usr/local/i686-mips-toolchain/bin \ # 指定已编译的Binutils路径 --enable-languages=c,c++ \ # 按需启用语言 --disable-multilib \ --disable-nls \ CFLAGS_FOR_HOST="-m32" \ # 仅针对host(i686)的编译用32位 CXXFLAGS_FOR_HOST="-m32" \ LDFLAGS_FOR_HOST="-m32" # 编译核心GCC和目标平台的libgcc make -j$(nproc) all-gcc make -j$(nproc) all-target-libgcc # 安装 sudo make install-gcc sudo make install-target-libgcc
如果需要完整的C++标准库,后续可以再编译all-target-libstdc++-v3并安装。
4. 验证结果
编译完成后,检查工具链的架构:
file /usr/local/i686-mips-toolchain/bin/mips-linux-gnu-gcc
输出应该包含ELF 32-bit LSB executable, Intel 80386,说明这是能在i686机器上运行的二进制文件。
内容的提问来源于stack exchange,提问作者Kirill Frolov
相关产品推荐
相关产品推荐

