「Go 1.8のMIPS32バイナリをルータ上で動かしてみた(成功編) - Qiita」で紹介した通り、Go 1.8からMIPS32のバイナリが作れるようになりましたが、FPU(浮動小数点数演算ユニット)用の命令を含むバイナリが生成される状況でした。
しかし、MIPS32チップの多く1はFPUを内蔵していないため、Go 1.8の吐くMIPS32バイナリは動かないことになります。こうした環境でもGoのバイナリを動かすためには整数演算命令で浮動小数点数演算を実装する、いわゆる「soft-float」のサポートが必要でした。
本稿では、GoのMIPS32のsoft-float対応の現状について紹介します。
GoのMIPS32 soft-floatサポートの状況
GoのMIPS32 soft-float対応の状況はGerritや「runtime: mips32 soft float point support · Issue #18162 · golang/go」あたりから読み取れます。
対応作業はほぼ終わっており、masterに取り込まれるのも時間の問題のようですが、Go 1.9のコードフリーズには間に合わなかったようですね。1.10で正式サポートということになりそうです。
ところで、上のissue上にGo 1.8.3へのバックポートパッチをまとめている方がいらっしゃいます。ありがたく使わせてもらいましょう。
soft-floatパッチを適用したGo 1.8.3をビルドする
下記の3ファイルを用意します。
go1.4-bootstrap-20170531.tar.gz
go1.8.3.src.tar.gz
-
go1.8.3sf.diff
(上のissueのリンク先から)
まずビルド用のツールチェインをビルドします。
$ tar xvzf go1.4-bootstrap-20170531.tar.gz
$ mv go go1.4-bootstrap-20170531
$ cd go1.4-bootstrap-20170531/src
$ ./make.bash
(snip)
$ cd ../..
ビルドした1.4のバイナリを使って1.8.3をソースコードからビルドします。
$ tar xvzf 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
(snip)
$ cd ../..
$ export PATH=$(pwd)/go1.8.3-mips32-softfloat-patch/bin:$PATH
参考: Installing Go from source - The Go Programming Language
soft-float版のバイナリを試す
では、パッチの当たったGo 1.8.3を使ってMIPS32のsoft-floatバイナリをビルドしてみましょう。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world!\n")
}
上のhello.go
を先ほど用意したgoバイナリでコンパイルします。
$ GOOS=linux GOARCH=mips go build -ldflags="-s -w" -o hello-sf hello.go
$ GOOS=linux GOARCH=mips GOMIPS=softfloat go build -ldflags="-s -w" -o hello-sf hello.go
soft-float版のバイナリを作るにはGOMIPS
環境変数にsoftfloat
という値を入れてやる必要があります。デフォルトはhard-floatです。
-rwxr-xr-x 1 hnw staff 1068896 8 11 12:57 hello-hf
-rwxr-xr-x 1 hnw staff 1068896 8 11 12:57 hello-sf
soft-float版とhard-float版と2つのバイナリを作ってみると、バイナリサイズが完全に一致しました。少し意外ですね。
これらをLinux/MIPS32環境にコピーして動かしてみます。
# uname -a
Linux lede01 4.4.15 #2 Fri Aug 12 10:51:10 UTC 2016 mips GNU/Linux
# ./hello-hf
Illegal instruction
# ./hello-sf
Hello, world!
無事soft-float版がFPUなしのMIPS32環境で動きました。やりましたね。
-
リッチな開発ボードなどであれば状況は違うのかもしれませんが、たとえば家庭用ブロードバンドルーターでFPUを搭載しているものは見たことがありません ↩