解决GO语言编译程序在openwrt(mipsle架构)上运行提示Illegal instruction问题

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压缩包下载地址

go1.8.3-mipsle-softfloat-Windows_amd64

阅读更多

更多精彩内容