交叉编译GNU coreutils for ARM遇执行错误,求解决建议
我之前交叉编译coreutils到ARM平台时也碰到过一模一样的问题!这个坑核心是没理清编译过程中主机端辅助工具和目标ARM程序的编译工具差异,导致本该在x64主机运行的make-prime-list被编译成了ARM架构的二进制,自然跑不起来。给你几个亲测有效的解决步骤:
问题根源
coreutils编译时会生成几个临时辅助工具(比如make-prime-list),这些工具是用来辅助生成目标程序的,需要在你的x64编译主机上运行。但如果交叉编译配置没做好,configure脚本会错误地用ARM交叉工具链编译这些辅助程序,生成的ARM二进制在x64主机上执行就会出现格式错误。
具体解决建议
1. 先正确配置交叉编译环境变量
先把ARM交叉工具链的环境变量设好(根据你实际的工具链前缀调整,比如arm-linux-gnueabihf-):
export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ export AR=arm-linux-gnueabihf-ar export LD=arm-linux-gnueabihf-ld
2. 用--build和--host参数明确告知configure架构信息
这是最关键的一步!configure脚本需要知道你的编译主机架构(x64)和目标平台架构(ARM),这样它才会分别用主机编译器和交叉工具链编译对应的程序。
假设你的x64主机架构是x86_64-pc-linux-gnu,目标ARM平台是arm-linux-gnueabihf,执行以下configure命令:
./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabihf --prefix=/path/to/your/arm/install/dir
这里--prefix是指定编译完成后安装到的目录,你可以根据自己的需求修改。
3. 手动指定主机编译器(如果configure还是识别错误)
如果上面的命令还是没生效,可能是configure没自动识别到主机的gcc,这时候可以手动设置BUILD_CC环境变量强制指定:
export BUILD_CC=gcc ./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabihf --prefix=/path/to/your/arm/install/dir
这样configure就会用主机的gcc编译make-prime-list这类辅助工具,不会再用交叉编译器了。
4. 清理残留文件后重新编译
如果之前已经尝试过编译,残留的中间文件可能干扰新的编译过程,先彻底清理:
make distclean
然后重新执行configure和编译:
./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabihf --prefix=/path/to/your/arm/install/dir make -j$(nproc) # 用所有CPU核心加速编译 make install
5. 排查:检查make-prime-list的架构
如果还是有问题,可以先检查生成的make-prime-list是什么架构,确认问题所在:
file make-prime-list
如果输出显示是ARM架构(比如ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)),说明还是用了交叉编译器编译它,回到前面的步骤确认--build参数和BUILD_CC是否正确设置;如果输出是x86_64架构,那问题可能出在其他依赖上,不过这种情况很少见。
内容的提问来源于stack exchange,提问作者Campa

