@tetsu_koba
誰得かよく知らない
Golang for ARM Linux
- ツールチェインのビルド
- ソースコードを入手してコマンドを入手したらソースコードからビルドできる
$ GOOS=linux GOARCH-arm GOARM=5 make.bash
実行型のビルド
GOARM
- GOARM=5 For armv5, no FPU, soft float
- GOARM=6(RaspPiの初代など) For armv6 デフォルト
- GOARM=7 For armv7 (32)
以上。
間違えなければどうということはない。
が、間違えたから理解が深まることもある
ツールチェインのビルドミス
- GOARMを指定しないと6になる
- デキた実行ファイルを実機に持って行って実行すると→Illegal Instruction
ランタイムライブラリがGOARM=6でビルドされているからか!
vldr d2, [r3]
やり直し。GOARM=5
逆アセンブルして確認→FPU命令がまだあるぞ
Go1.4はarmv5サポートはなくなった?
Go ARMがカーネルコンフィグに依存するとはどこにも書いていない
謎の関数 _sfloat
フロート演算のコードに共通する謎関数
_sfloat →vlop_arm.s
実体は、FPU命令のインタープリタ
pc...プログラム・カウンタ?
あ、これ、ARMの命令をインタプリタしている
プログラム・カウンタは違ったところを指している
GOARM=5と6の違い
- どちらもFPU命令を生成
- GOARM=5の場合はFPU命令の塊の前に_sfloatへの呼び出しが挿入される(リンカーがそれをやってる)
- 生成されたFPU命令は同じ(コンパイラはsoft floatのための命令を生成していないので実装は楽)
- ARMv5とかいる?みたいなまさかり
結論
- Golangは自前でsoft float emulationする仕組みを持っている
- カーネルのsoft float emulationは不要
- 正しくビルドすれば動く
その他
- アプリをビルドするときにGOARM=6にすると、カーネルが動いてFPUがあるかどうかを確認するルーチンが存在したりする
- 失敗したぶんだけ勉強するハメになる