RT...最近在研究openwrt(mipsle架构)上运行go语言编译出来的程序...一运行就报"Illegal instruction"这样的错误...百度和Google搜索了一遍
得出两种解决方案.(PS:更新一遍.当时写这个文档的时候没有发现Golang 1.9还是1.10版本增加了模拟软浮点类型.)
0.使用Golang1.10版本编译时带上GOMIPS=softfloat 进行编译即可
GOMIPS=softfloat
1.开启openwrt内核中的FPU
开启方法是在openwrt源码目录中执行
make kernel_menuconfig
然后找到MIPS FPU Emulator
(图片来自网络)
开启之后重新编译openwrt源码.
但是我并没有在openwrt中发现此选项...连最新的chaos_calmer源码目录中也未发现此选项....
2.使用Go1.8.3打补丁方式重新编译Go1.8.3
首先要准备3个文件 go1.4-bootstrap-20170531.tar.gz go1.8.3.src.tar.gz go1.8.3sf.diff
本人编译时环境是Ubuntu16.04. 64位
执行以下命令
tar xzf go1.4-bootstrap-20170531.tar.gz
mv go go1.4-bootstrap-20170531
cd go1.4-bootstrap-20170531/src
./make.bash
cd ../..
执行./make.bash时有几率会出现缺少环境变量的错误
无错误继续执行
tar xzf go1.8.3.src.tar.gz
mv go go1.8.3-mips32-softfloat-patch
cd go1.8.3-mips32-softfloat-patch
patch -p1 < ../go1.8.3sf.diff
cd src
GOROOT_BOOTSTRAP=$(pwd)/../../go1.4-bootstrap-20170531 ./all.bash
cd ../..
执行GOROOT_BOOTSTRAP=$(pwd)/../../go1.4-bootstrap-20170531 ./all.bash 前可先将GOOS的环境变量设置成windows
GOARCH设置成amd64后再执行 这样编译后的go可以在windows 64位环境运行....
编译完了后可以编译go源码到mipsle上运行
编译时添加GOMIPS=softfloat参数及对应的平台参数即可在openwrt上运行...例:本人在windows上编译的命令
env GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -ldflags="-s -w" main.go
最后附上本人编译过后在windows10(64位)环境上可用的GO压缩包下载地址