正直日記



2009/11/14

_ golangクロスコンパイラを捏造する
go 社を会場に繰り広げられた勉強会に赴き、そこで何故か一人黙々と ARM 版 go
のビルドを行ってきた。恥ずかしい話だけど、諸事情で二日寝ておらず目が血走っ
ており、なんだか気を使わせてしまって申し訳ないことをした。寝ぼけたことも
多分言った。

--

(追記:下記で 5c と書いている部分と 5c に絡む解説部分は全て勘違いでした。
エラーが出るのは libcgo のみで、 5c 自体はコンパイル出来るようです)

まず普通の go コンパイラ。 5c libcgo のコンパイル時に、 arm.o の生成ルー
ルを見つけられずにエラー終了する。

golang だけ使う分には 5g と 5l があればいいのだが、 C と連携したい場合に
こま……いや困ることは無いかなぁ。

5c libcgo には go と C の関数を仲介する arm.S と、スレッドを仲介する 
linux_arm.c が必要なのだけど、取り合えず arm.S を捏造して前者だけまかな
うことにする。どちらにしても 5c libcgo が使えないことは変わりないけど。

arm.S のアセンブルには x86-gcc が使われてしまうので、一筋縄ではいかない。
結局 arm-gcc -fPIC でコンパイルしたコードからバイナリを抽出して直接 .long
で埋め込んでやった。バイナリサイコー。

更に linux_arm.c の中身を賄ったとして、こちらも arm-gcc でコンパイルする
必要がある(しかも ARM 版の pthread ライブラリが要るはず)と思うけどどう
するんだろう? libcgo を 5c の外に出して、 5l で使うようにしないといけな
い気がする。


objdump で 5.out を逆アセンブルしたら r0-r3, sp, lr, pc しかレジスタを使っ
ていないようだ。おかげでかなり冗長なコードになっていた。まぁ RISC のコー
ドなんて冗長なものだろという伝説もある。ARM は CISC 的なにおいもするけど。

ちなみに、 5g / 5l で生成した 5.out を qemu-arm (0.11.0) で実行したら
Segmentation Fault が返ってきた……。いつか beagleboard でも試してみたい
ところ。

--

次に gccgo。

gccgo のソースには Split Stacks という拡張が加えられており、goroutine の
(gccgo 版の)肝になっているようなのだが、ARM 版はまだ着手されていないの
で 386 版を参考に同様の変更をする必要がある。えーとどこだったかな、もう
忘れてしまった……。(diff とれば一発だけど面倒くさい)

configure オプションは以下の通り。

../gccgo/configure \
  --enable-languages=c,go \
  --build=i686-pc-linux-gnu \
  --host=i686-pc-linux-gnu \
  --target=arm-eabi \
  --with-cpu=arm9tdmi \
  --enable-interwork \
  --enable-multilib \
  --with-gcc \
  --with-gnu-ld \
  --with-gnu-as \
  --disable-shared \
  --disable-debug \
  --disable-nls \
  --disable-libmudflap \
  --disable-libssp \
  --disable-libgomp \
  --disable-zlib \
  --disable-libstdcxx-pch \
  --prefix=$HOME/gccgo-arm

多分 libffi で詰まると思うので、3.0.9rc3 を落としてきて差し替えると吉。

で、えーと libgo の移植が済んでないのでビルドは途中で終わるよ……。


あまり関係ないけど gccgo/gcc/go/gogo.cc と、[/gco.]だけで構成されている
ディレクトリがあって、なんだか面白かった。イケイケだ。

あとマスコットはかわいいと思うんだよ俺は。

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12