[ Top | Memo | Diary | Aerial ]

OpenBlockS を使おう!


クロスコンパイル環境の構築

OpenBlockS はデータ領域の節約のため、デフォルトではエディタも開発ツールも入っていません。ほしいデーモンを入れて自分用にカスタマイズして使いたい場合、開発環境が必要になります。開発には OpenBlockS 上にコンパイラをインストールして自前で作るセルフコンパイル環境を整える方法と、別の計算機上にクロスコンパイラをインストールするクロスコンパイル環境を整える方法と、2つあります。

前者に関しては OpenBlockS の公式サイトからたどってセルフコンパイル環境を含んだ hdroot アーカイブを使用すれば最低限の環境が作れますが、OpenBlockS は CPU に PowerPC 86T 50MHz を搭載した PPC 機で、処理能力としては 486 クラスだそうで、セルフコンパイルだと気の遠くなるような時間がかかります。そこで、ここではホストに高速な PC/AT 互換機を用いてクロスコンパイルする後者の方法を取ります。

クロスコンパイルに当たって

OpenBlockS をターゲットとしてクロスコンパイル環境を構築するに当たっては、OpenBlockS が Linux kernel 2.2.13、ライブラリ glibc 2.1.12 を使っているので、ホストは x86 の Linux を使って gcc でクロスコンパイルするのがもっとも手軽です。今回は検証に当たってホスト環境は Vine Linux 2.5 (カーネル 2.4.18/glibc 2.2.4/gcc 2.95.3/binutils 2.11.90)の Dual PentiumPro @ 200 MHz マシンを使用しました。

まず、必要となるのは次のものです。

この3つはクロス用 gcc を作るために必要なものです。それぞれリンカ・アセンブラ、実行開始用のライブラリ、それにコンパイラとなっていて、この順番にインストールすると最低限の環境が整います。カーネルを再構築したい場合はここまでで OK で、OpenBlockS を使い倒すなどを参考にカーネルのクロスビルドに挑戦してください ;-)

これらはユーザ側アプリケーションをコンパイルするために必要なもので、Apache をリビルドしたいとか NIS 環境をクロスビルドしたいとかいう場合に不可欠です。

さぁ、始めよう!

binutils, gcc はたとえば ftp.ring.gr.jp/pub/GNU/ などにあるので入手しましょう。gcc はまず最初、最低限の機能だけ備えた gcc-core というものを作成し、ライブラリが完成したらフル装備の gcc をそのあとで再構築します(FreeBSD でも make world のとき gcc を2回ビルドします)。newlib は ftp://ftp.u-aizu.ac.jp/pub/gnu/cygnus/newlib/ あたりにあります。

まずは binutils からインストールしましょう。クロスコンパイル環境はなにも指定しなければ /usr/local の下にインストールされますが、ライブラリ類を OpenBlockS 用に NFS で提供することも考えて /opt の下にインストールすることにします。いくつかのバイナリはクロスコンパイルできないので、途中までクロスコンパイルしておいて必要なところだけ NFS マウントしてセルフコンパイルする、などと機転を利かせるとよいです。

binutils はそのまま展開してインストールするだけです。一応ビルドするディレクトリとソースのあるディレクトリは分けたほうがよいので、別にディレクトリを作りましょう。(以降 % は一般ユーザ権限で行う作業、# はルート権限で行う作業を指します)

% tar xjf binutils-2.12.1.tar.bz2
% mkdir binutils
% cd binutils
% ../binutils-2.12.1/configure --prefix=/opt --target=powerpc-linux
% make
# make install

これで /opt/bin に powerpc-linux-ar などのバイナリがインストールされました。csh/tcsh や zsh を使っている場合は rehash してちゃんとパスが通っていることを確認してください。今回は /opt にインストールしているので、忘れず /opt/bin がパスに含まれるようにシェルを設定してください(もしくは素直に /usr/local にインストールすればよいでしょう)。

% which powerpc-linux-ar
/usr/bin/which: no powerpc-linux-ar in (/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/opt/bin)
% setenv path=($path /opt/bin)
% rehash
% which powerpc-linux-ar
/opt/bin/powerpc-linux-ar

次は gcc-core のインストールです。gcc のビルドに newlib が必要になるので、newlib を展開してリンクを張ります。

% tar xzf gcc-core-2.95.3.tar.gz
% tar xzf newlib-1.9.0.tar.gz
% cd gcc-2.95.3
% ln -s ../newlib-1.9.0/newlib .
% cd ..
% mkdir gcc-core
% cd gcc-core
% ../gcc-2.95.3/configure --prefix=/opt --target=powerpc-linux --with-newlib
% make
# make install

最後に newlib をコンパイルします。newlib のコンパイルまで完了すれば、一応バイナリが作成できる環境は整います。

% mkdir newlib
% cd newlib
% ../newlib-1.9.0/configure --prefix=/opt --target=powerpc-linux
% make
# make install

さて、ここで一息つきましょう。バイナリがコンパイルできるとはいえ、このままではカーネルくらいしかコンパイルできないので(しかもカーネル自体もそのままではコンパイルできません)、次に glibc をインストールします。glibc までインストールすればユーザランドも含めて完全なクロスコンパイル環境の完成です。

glibc をコンパイルするのは面倒、という人はぷらっとで配布されている crt.tgz (ftp://ftp.plathome.co.jp/pub/OpenBlockS/crt.tgz) を /opt/powerpc-linux/lib に展開すればそのままクロスコンパイル環境が構築できますが、ここでは glibc 全体をフルビルドする方法をとります。

クロスコンパイルへの道

glibc のソースは gcc などと同じく GNU のミラーサイトから入手するのが簡便です。ftp://ftp.ring.gr.jp/pub/GNU/glibc/ あたりを探して glibc-2.1.3.tar.gz/glibc-crypt-2.1.tar.gz/glibc-linuxthreads-2.1.3.tar.gz を取得してください。

また glibc の構築にはカーネルのヘッダが必要になるので、2.2 系の適当なソースを拾ってきてください。ここでは 2.2.20 のソースを使います。

% cd /opt/powerpc-linux
# mkdir src
# cd src
# tar xjf /some/where/linux-2.2.20.tar.bz2 ← ソースを展開してください
# cd linux

カーネルソースの Makefile を見れば分かる通り、クロスコンパイルするには2ヶ所修正する場所があるのでエディタで Makefile を開いて書き換えてください。

ARCH := ppc
CROSS_COMPILE = powerpc-linux- ← 最後の '-' を忘れないようにしましょう

の2ヶ所です。Makefile の冒頭部分にあるのですぐ見つかるでしょう。

このあと普通にカーネルを構築するときのように make config しますが、単に make dep してヘッダを適切に設定してもらいたいたいだけなので、なにも変更せず make config を終了してかまいません。

# make config ← menuconfig でもなんでも適当に
# make dep

これでヘッダの準備は完了しました。glibc 本体に取りかかりましょう。

glibc-2.1.3 には locale/C-ctype.c にコンマが1つ足りないというバグがあるので、パッチ(glibc-ctype-2.1.3.patch)を当てるか手動で書き換えてください。パッチの中身は

--- glibc-2.1.3/locale/C-ctype.c.orig   Fri Feb 25 07:48:02 2000
+++ glibc-2.1.3/locale/C-ctype.c        Sat Aug 10 23:07:14 2002
@@ -374,7 +374,7 @@
 #endif
     { string: (const char *) (_nl_C_LC_CTYPE_toupper + 128) },
     { string: NULL },
-    { string: (const char *) (_nl_C_LC_CTYPE_tolower + 128) }
+    { string: (const char *) (_nl_C_LC_CTYPE_tolower + 128) },
 #if BYTE_ORDER == BIG_ENDIAN
     { string: NULL },
 #endif

となっています。

% tar xzf glibc-2.1.3.tar.gz
% cd glibc-2.1.3
% tar xzf ../glibc-crypt-2.1.tar.gz
% tar xzf ../glibc-linuxthreads-2.1.3.tar.gz
% patch -p1 ≶ ../glibc-ctype-2.1.3.patch ← 手動で修正したなら不要です

あとは前と同じく glibc 専用ビルドディレクトリを作って make するだけです。クロス環境用のライブラリに入ってほしいので、prefix には /opt/powerpc-linux を指定します(prefix を指定しないで /usr/local にクロス環境を入れたなら /usr/local/powerpc-linux)。また、glibc の INSTALL ファイルを見ると、クロスコンパイルのときは CC や AR, RANLIB を指定しろ、と書いてあるのでその通りにします。さすが glibc だけあってコンパイルにかなりの時間がかかりますが、気長に待ちましょう。

% cd ..
% mkdir glibc-build
% cd glibc-build
% TARGET=powerpc-linux
% CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib \
	../glibc-2.1.3/configure --prefix=/opt/$TARGET \
	--enable-add-ons=crypt,linuxthreads \
	--with-headers=/opt/$TARGET/src/linux/include $TARGET ←1行で入れましょう
% make CC=$TARGET-gcc
# make install
# make install-headers
# cat */stub > /opt/$TARGET/include/gnu/stubs.h

info のインストールでエラーが出ますが、ライブラリはインストールされるので問題はありません。ヘッダを設定しなくてもカーネルのコンパイルはできるのですが、実際アプリケーションをコンパイルするためにはヘッダの設定も必須です。

あとは始末のためにシンボリックリンクを張りましょう。

% cd /opt/powerpc-linux/include
# ln -s ../src/linux/include/asm .
# ln -s ../src/linux/include/linux .

これはクロスビルドのとき Linux カーネルヘッダを powerpc-linux-gcc が見つけられるようにするためです。

おつかれさま

さて、これでクロスコンパイル環境の構築は終了です。お疲れさまでした。Hello, World! をクロスコンパイルして動かしてみましょう :-) c 以外にも c++ で書かれたソースをコンパイルしたい場合は、GNU のサイトから gcc のフルセットを取得してコンパイルしてください。それでは、このクロスコンパイル環境を使って OpenBlockS を存分に活用してください。

参考リンク:

[おまけ] FreeBSD でもクロスコンパイル

Linux の i386 機で PowerPC のバイナリをクロスコンパイルする方法は上に述べた通りです。しかし、自分のメイン環境は FreeBSD なので、FreeBSD でもクロスコンパイルをできるようにしてみましょう :-)

ここでの検証は FreeBSD 4.6.1-RELEASE (gcc 2.95.3/binutils 2.11.2)をホストに用いました。ターゲットはもちろん OpenBlockS です。

準備するものは、Linux で必要なものに加え、gmake と autoconf に gettext と bash です。autoconf と gettext はそれぞれバージョン 2.12 以上、0.10.35 以上が必要なようですが、FreeBSD 4.6.1-RELEASE の ports/packages からインストールすればこれはクリアするので問題ありません。古いリリースの FreeBSD を使っている場合は、この要求をクリアしているか pkg_info で調べ、古ければ新しいものに入れ換えましょう。

binutils と gcc-core のインストールは同じです。--target=powerpc-linux でインストールしましょう。

Linux カーネルのヘッダを準備するとき少し手入れが必要です。カーネルソースの Makefile に ARCH と CROSS_COMPILE を指定するのに加え、冒頭の CONFIG_SHELL を bash のフルパス(port/package から入れたら /usr/local/bin/bash)に変更、また ファイルの中ほどに MAKE=make となっている場所を MAKE=gmake と変更してください。これは Linux では bash が /bin/bash もしくは /bin/sh としてインストールされるのと、FreeBSD の make は BSD make で GNU make は gmake という名前で別にインストールされるからです。

gmake menuconfig; gmake dep が終われば次は glibc のコンパイルです。configure が gmake を発見できないので、MAKE=gmake と手動で指定します。

% TARGET=powerpc-linux
% CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib MAKE=gmake \
	../glibc-2.1.3/configure --prefix=/opt/$TARGET \
	--enable-add-ons=crypt,linuxthreads \
	--with-headers=/opt/$TARGET/src/linux/include $TARGET
% gmake CC=$TARGET-gcc ← これも gmake を使います

ちゃんと configure にも CC を指定しないと、ヘッダファイルが見つからないと怒られます。面倒がらずに入力しましょう。

あとは同じように gmake install と gmake install-headers すればよいです。/usr/local/powerpc-linux/include/gnu/stubs.h は touch で作成しましょう。これでクロスコンパイル用のライブラリとヘッダファイルが完成します。実際にこのクロスコンパイラでバイナリを生成することは可能なのですが、さまざまなアプリケーションをコンパイルしようとすると、環境変数をいちいち指定しないとコンパイルできません(まあ、CC=powerpc-linux-gcc ./configure --target=powerpc-linux --host=i386--freebsd くらいでコンパイルできるのですが)。そこで、クロスビルド用のスクリプトを用意すると便利です。

[ Top | Memo | Diary | Aerial ]


小町守 (奈良先端科学技術大学院大学), mamoru dot komachi at gmail dot
com
Mamoru KOMACHI (Nara Institute of Science and Technology)
Last modified: ÌÚÍËÆü, 21- 9-2006 20:26:06 JST