交叉编译mips-openwrt-linux时遇mips1 opcode不支持错误求助
问题描述
交叉编译Protobuf到mips-openwrt-linux平台时,出现汇编指令不兼容错误,提示生成的代码使用了MIPS1指令集操作码,但目标架构是MIPS_R2,工具链为toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2。错误信息如下:
/tmp/cczgWQVg.s: Assembler messages:
/tmp/cczgWQVg.s:117: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$3,$4' /tmp/cczgWQVg.s:150: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$3,$4'
/tmp/cczgWQVg.s:169: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$4,$5' /tmp/cczgWQVg.s:181: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$3,$4'
/tmp/cczgWQVg.s:201: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$3,$4' /tmp/cczgWQVg.s:207: Error: opcode not supported on this processor: mips1 (mips1)movn $2,$0,$3'
/tmp/cczgWQVg.s:765: Error: opcode not supported on this processor: mips1 (mips1)movn $3,$2,$4' /tmp/cczgWQVg.s:1735: Error: opcode not supported on this processor: mips1 (mips1)teq $2,$0,7'
/tmp/cczgWQVg.s:1797: Error: opcode not supported on this processor: mips1 (mips1)movn $3,$2,$4' /tmp/cczgWQVg.s:1805: Error: opcode not supported on this processor: mips1 (mips1)movn $3,$2,$4'
/tmp/cczgWQVg.s:2968: Error: opcode not supported on this processor: mips1 (mips1)movz $2,$3,$4' /tmp/cczgWQVg.s:2971: Error: opcode not supported on this processor: mips1 (mips1)movn $3,$2,$4'
已尝试设置CXXFLAGS="-D__MIPSEL__ -march=mips32",但问题未解决。
解决步骤
1. 全面传递架构编译选项
仅设置CXXFLAGS可能无法覆盖所有编译环节,需要同时指定CFLAGS、CPPFLAGS,并明确指向MIPS32R2架构:
CFLAGS="-march=mips32r2 -EL" \ CXXFLAGS="-march=mips32r2 -EL" \ CPPFLAGS="-march=mips32r2 -EL" \ ./configure --host=mips-openwrt-linux --prefix=/your/install/path
注:-EL对应小端模式(MIPSEL),如果是大端平台则用-EB,根据实际情况调整。
2. 禁用Protobuf的汇编优化
部分Protobuf版本会默认生成MIPS1汇编代码,可通过禁用汇编优化强制使用纯C++实现:
CC=mips-openwrt-linux-gcc CXX=mips-openwrt-linux-g++ \ CFLAGS="-march=mips32r2 -EL" \ CXXFLAGS="-march=mips32r2 -EL" \ ./configure --host=mips-openwrt-linux --prefix=/your/install/path --disable-asm
3. 确认交叉编译器路径正确
确保编译时调用的是工具链自带的交叉编译器,而非系统默认gcc:
- 检查编译器路径:
which mips-openwrt-linux-gcc,确认输出是工具链目录下的程序 - 配置时明确指定编译器:
CC=/path/to/toolchain/bin/mips-openwrt-linux-gcc \ CXX=/path/to/toolchain/bin/mips-openwrt-linux-g++ \ CFLAGS="-march=mips32r2 -EL" \ CXXFLAGS="-march=mips32r2 -EL" \ ./configure --host=mips-openwrt-linux --prefix=/your/install/path
4. OpenWrt SDK环境下的处理
如果是在OpenWrt SDK中编译,需修改Protobuf包的Makefile:
- 在package目录找到protobuf的Makefile,添加:
TARGET_CFLAGS += -march=mips32r2 TARGET_CXXFLAGS += -march=mips32r2
- 然后执行
make package/protobuf/compile V=s重新编译
内容的提问来源于stack exchange,提问作者vudinhlong

