2009年10月5日月曜日

make uImage と crosstool-ng

昨日、BeagleBoard 上のセルフコンパイルで Linux カーネルをビルドできるようになりました。というか、実はまだ BeagleBoard 用のカーネルではなくて、Debian ARM の標準カーネルなんですけど。vmlinux までは無事に生成できて、mkimage を動かしてみようと思ったのですが、ふと vmlinuz は要らんのか、と思いつきました。BeagleBoard の mkimage サンプルが、vmlinuz を使っているからです。

Linux カーネルについては、昔ちょっとだけ勉強したような気もするのですが、vmlinuz とか bzImage とか、忘れました。今日、会社の昼休みに U-Boot のドキュメントとか読んでみたのですが、mkimage の要求もよく分かりません。しかしいろいろググっていたところ、Linux のカーネルビルドで make uImage とかできることが分かり、そちらを試してみようと思っています。

さて。家に帰ってから早速 make uImage してみようと思ったのですが、やはり BeagleBoard 上でのセルフビルドには時間がかかります。一番の原因は、プロセッサの処理速度というよりも、ローカルディスクの容量と速度が不十分なことです。今は、カーネルソースを NFS サーバーに置いているのですが、やはりローカルディスクに敵いませんし、/tmp が SD カード上というのも(フラッシュメモリは書き換えに弱いので)不安が残ります。tmpfs を使えば良いのでしょうが、今度はメモリサイズが気になります。最終的にはセルフコンパイラの恩恵に与るとしても、普段の実験には Celeron 1.8GHz を使いたいと思いました。

そんな訳で、改めて crosstool を試してみることにしました。昨日の実験で、Linux カーネルのビルド方法を少しずつ思い出したのも、その決断を後押ししています。

最初、crosstool の 0.43 を試してみたのですが、なんと gcc が -march=armv7-a というオプションを受け付けないことが判明しました。どうも、GCC のバージョン 4.1.0 では古すぎるようです。再度ググってみたところ、今は crosstool-ng というのがあるそうで、そちらを試すことにしました。ng と言っても、無印 crosstool とはかなり違うようで、いきなり configure && make install が必要になったりしました。(後で分かりましたが、Linux カーネルのビルドを真似しているようです。)

crosstool-ng 1.4.2 のインストール後、

$ ct-ng arm-unknown-linux-gnu
$ ct-ng menuconfig
$ ct-ng build

としてみたのですが、途中で gcj がなんとかと言って落ちました。おおお、Java は要らん、Java は! という訳で、今度は ct-ng menuconfig で、Java と Fortran の選択を外してみました。再度 ct-ng arm-unknown-linux-gnu build したところ、今度は autoconf や automake のバージョンが古いといって怒られます。さらに、glibc-cvs-2.9 とかいうのを拾いにいって失敗したり、いろいろ苦労しました。結局、tar.gz から autoconf 2.60 と automake 1.10.2 をインストールし、さらに menuconfig で調整した結果、今のところかなり順調にビルドが進んでいます。

果たして、crosstool-ng は無事にインストールできるのでしょうか。そんでもって、BeagleBoard 用のカーネルのクロスビルドはできるのでしょうか!?

後記 1

とりあえず、セルフ環境での make uImage はうまく行きそうです。まだ、Debian ARM のカーネルで試しただけですが。

後記 2

crosstool-ng 1.4.2 での armel コンパイラは無事にビルドできました。最適な環境かどうか、また、今のところ BeagleBoard のカーネルがビルドできるかどうか不明ですが、とりあえず crosstool-ng 1.4.2 用の .config ファイルをここに置いておきます。

0 件のコメント:

コメントを投稿

フォロワー