在Cygwin环境下使用MinGW交叉编译Zlib时出现汇编指令后缀无效异常错误的问题排查
解决Cygwin Shell中MinGW交叉编译Zlib的汇编指令错误问题
这种情况我之前调试交叉编译环境时碰到过好几次,核心原因是Cygwin环境默认的汇编器和MinGW 32位交叉编译器的目标架构不兼容,具体细节如下:
问题根源
当你在Cygwin Shell中运行/bin/i686-w64-mingw32-gcc.exe时,gcc会默认调用Cygwin系统自带的as(GNU汇编器)。而Cygwin的as是为64位Cygwin/x86_64环境编译的,它只识别64位的汇编指令后缀(比如pushq);但你的MinGW 32位编译器生成的是32位x86汇编代码(用pushl这类后缀),两者指令集不匹配就会抛出invalid instruction suffix for 'push'这类错误。
而在Windows Shell中运行时,系统找不到Cygwin的64位汇编器,gcc会自动调用同目录下配套的MinGW 32位汇编器,自然能正常处理32位指令。
可行的解决办法
1. 强制指定MinGW配套的汇编器
编译时通过-B参数告诉gcc使用MinGW工具链自带的汇编器,而非Cygwin的系统汇编器:
$ /bin/i686-w64-mingw32-gcc.exe -B/usr/i686-w64-mingw32/bin/ -O3 -Wall -c -o adler32.o adler32.c
-B参数指定的路径是MinGW 32位工具链的bin目录,里面包含了适配32位架构的as汇编器。
2. 调用完整路径的MinGW交叉编译器
直接调用/usr/i686-w64-mingw32/bin/i686-w64-mingw32-gcc,这样gcc会自动关联同目录下的配套工具链组件,避免误调用Cygwin的系统工具。
3. 用MinGW专用Make工具编译整个Zlib项目
如果是编译完整的Zlib项目,更省心的方式是使用mingw32-make,它会自动适配交叉编译环境:
# 先配置交叉编译目标 $ ./configure --prefix=/usr/i686-w64-mingw32 --host=i686-w64-mingw32 # 用mingw32-make执行编译 $ mingw32-make
内容的提问来源于stack exchange,提问作者Roman Maltsev
相关产品推荐
相关产品推荐

