それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

玄箱(ppc)のクロスコンパイル環境を作る&カーネルビルド


玄箱のコンパイルは遅いのでクロスコンパイルをする。Debian(ubuntu)だととても楽ちん

apt-line を追加する。
root # echo "deb http://www.emdebian.org/debian/ lenny main "\
     >> /etc/apt/sources.list
root # aptitude update
ビルドに必要な一式
aptitude install build-essential ncurses-dev
PPCのクロスコンパイラ一式を入れる
aptitude install libc6-dev-powerpc-cross \
                 gcc-4.3-powerpc-linux-gnu \
                 binutils-powerpc-linux-gnu

終わり。ホントこれだけだった。

クロス・コンパイルを実行して、動くかためしてみる
echo "#include <stdio.h> 
main(){
	printf(\"Hello world\");
}
" >> test.c
powerpc-linux-gnu-gcc test.c 
./a.out                                               #コンパイル元で実行してみる
-bash: ./a.out: バイナリファイルを実行できません   #当然実行できない。クロスコンパイル成功してる見たい

玄箱(ppc))で実行してみる

rsync a.out root@kurobox:/root #玄箱へバイナリを転送
ssh kuro-box "/root/a.out"     #起動する
Hello World          #無事動く
                               #クロスコンパイル成功!オメデトウ
動かない場合。
root@KURO-BOX:~# ./a.out
Inconsistency detected by ld.so: dynamic-link.h: 62: elf_get_dynamic_info: Assertion `! "bad dynamic tag"' failed!

等とと出る。これは純正玄箱のビルドパッケージが入っていないのが起因だと思う。

玄箱カーネルをコンパイルする

hello world が動くなら カーネルもコンパイルできるよね!

wget http://www.genbako.com/kurobox-sources-2.6.25.patch &
wget http://www.genbako.com/kurobox-section-mismatch2625.patch &
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.1.tar.bz2 &

tar jxpvf linux-2.6.25.1.tar.bz2
cd linux-2.6.25.1
patch -Np1 <../kurobox-section-mismatch2625.patch
patch -Np1 <../kurobox-sources-2.6.25.patch        #configが作られる
cp config_kurobox .config # HG と無印 玄箱 で ファイルが違う
export ARCH=ppc
export CROSS_COMPILE="powerpc-linux-gnu-"
make oldconfig
make menuconfig             # menuconfig で iptables/VLAN/NFS 等モジュール組み込み
make CROSS_COMPILE="powerpc-linux-gnu-" vmlinux 
powerpc-linux-gnu-objcopy -O binary vmlinux vmlinux.bin
make CROSS_COMPILE="powerpc-linux-gnu-" modules
make ARCH=ppc  INSTALL_MOD_PATH=../modules-tmp modules_install #とりあえず modules を一階層上に完成させておく

あっけないほど短時間で終る。カーネルはできあがったら、玄箱に転送してカーネルを入れ替える。
玄箱だと90分かかる作業が数分で終った。x86 は偉大

あと、たしかMakefile を若干修正した
ファイルの何処か忘れたけど、、、grep するとたぶん出てくる。これ修正しないと binutils のチェックがエラーになる

-     @if ! /bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1 ; then \
+     @if ![[ "/bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1" ]] ; then \

カーネルビルド画面

ビルドが終ったら玄箱に転送します。

TARにまとめて転送
tar cvzf source.tgz ./linux-2.6.25.1 #ソース
scp source.tgz 192.168.20.201:~    
玄箱側で展開
tar zxvf source.tgz 
既存ファイルをいったん待避
sudo cp -p /boot/vmlinux.bin /boot/vmlinux.bin.2010-10-14
sudo cp -p /boot/System.map /boot/System.map.2010-10-14
作ったファイルで上書き
cd ./linux-2.6.25.1
sudo cp -p ./vmlinux.bin /boot/vmlinux.bin
sudo cp -p ./System.map /boot/System.map
sudo chown root:root /boot/*
モジュールも待避&入れる
sudo cp -r /lib/modules/2.6.25.1-kurobox  /lib/modules/2.6.25.1-kurobox.2010-10-14
#ソースとビルドを保管しておく
sudo mkdir /lib/src
sudo cp -r linux-2.6.25.1 /lib/src/
#モジュール入れる
cd /lib/src/linux-2.6.25.1
export ARCH=ppc 
sudo make modules_install
再起動
sudo reboot #ドキドキしながら