Edited at

GoのMIPS32 soft-float対応が来たぞー(1.9に入るとは言っていない)

More than 1 year has passed since last update.

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ファイルを用意します。

まずビルド用のツールチェインをビルドします。

$ 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バイナリをビルドしてみましょう。


hello.go

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環境で動きました。やりましたね。





  1. リッチな開発ボードなどであれば状況は違うのかもしれませんが、たとえば家庭用ブロードバンドルーターでFPUを搭載しているものは見たことがありません