Sarge de ARM CROSS
今Sarge上で使っているtoolchainは回収して環境を再構築できるようにして、再配布できるようにソースも集めて、それでも足りないものは作ったりしたのだけど、バージョンはいかにも古くて、バグリポートも上がっているものが多く、ちょっと使えない。
こんなのもらってもうれしい人いないし。
おまけに今日はそれらの由来も判明してかなりがっかり... orz
Etchと違ってSargeならarm-linux-なんたらでやれるんじゃないかと思って、dokg-crossを一通り試す。
しかし、dpkg-crossでは以下の5つが自動生成できなかった。
cpp-3.4-arm-cross_3.4.3-13sarge1_all.deb
g++-3.4-arm-cross_3.4.3-13sarge1_all.deb
gcc-3.4-base-arm-cross_3.4.3-13sarge1_all.deb
libstdc++6-0-pic-arm-cross_3.4.3-13sarge1_all.deb
libc6-dbg-arm-cross_2.3.2.ds1-22sarge6_all.deb
それに、やっぱりgccの関係で、arm-linux-gnu-なんたらでやらないとダメみたいだ。
SlindベースでSargeをアップデートして、必要なものを入れる。
コンパイル可能かどうかテスト。
makai:~# vi hello.c #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } makai:~# arm-linux-gnu-gcc-3.4 hello.c makai:~# ./a.out -su: ./a.out: cannot execute binary file makai:~# file a.out a.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped makai:~# rm hello.c a.out
バイナリはできている。
パッケージはというと、ビルドできずに失敗する。
makai:~# apt-get build-dep grep makai:~# apt-get source grep makai:~# cd grep-2.5.1.ds1/ makai:~/grep-2.5.1.ds1# dpkg-buildpackage -uc -us -aarm (略) checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets ${MAKE}... yes checking build system type... i386-pc-linux-gnu checking host system type... arm-unknown-linux-gnu checking for gawk... (cached) gawk checking for arm-linux-gcc... arm-linux-gcc checking for C compiler default output... configure: error: C compiler cannot create executables make: *** [config.status] Error 77 make: Leaving directory `/root/grep-2.5.1.ds1'
arm-linux-gccを呼んでしまっている。
これって、確か、dpkg-architectureの吐く結果をパースしているだけのはずだ。
makai:~/grep-2.5.1.ds1# dpkg-architecture -aarm dpkg-architecture: warning: Specified GNU system type arm-linux does not match gcc system type i386-linux. DEB_BUILD_ARCH=i386 DEB_BUILD_GNU_CPU=i386 DEB_BUILD_GNU_SYSTEM=linux DEB_BUILD_GNU_TYPE=i386-linux DEB_HOST_ARCH=arm DEB_HOST_GNU_CPU=arm DEB_HOST_GNU_SYSTEM=linux DEB_HOST_GNU_TYPE=arm-linux
正解。
これが悪い。
arm-linux-gnuと出してくれないとだめだ。
dpkg-architectureは単なるスクリプトファイルだったはずなので中を見る。
makai:~/grep-2.5.1.ds1# which dpkg-architecture /usr/bin/dpkg-architecture makai:~/grep-2.5.1.ds1# file /usr/bin/dpkg-architecture /usr/bin/dpkg-architecture: perl script text executable makai:~/grep-2.5.1.ds1# vi /usr/bin/dpkg-architecture %archtable=('i386', 'i386-linux', 'arm', 'arm-linux-gnu',
変更して試す。
makai:~/grep-2.5.1.ds1# dpkg-architecture -aarm dpkg-architecture: warning: Specified GNU system type arm-linux-gnu does not match gcc system type i386-linux. DEB_BUILD_ARCH=i386 DEB_BUILD_GNU_CPU=i386 DEB_BUILD_GNU_SYSTEM=linux DEB_BUILD_GNU_TYPE=i386-linux DEB_HOST_ARCH=arm DEB_HOST_GNU_CPU=arm DEB_HOST_GNU_SYSTEM=linux-gnu DEB_HOST_GNU_TYPE=arm-linux-gnu
出るようにはなった。
ビルドのテスト。
makai:~/grep-2.5.1.ds1# debian/rules clean makai:~/grep-2.5.1.ds1# dpkg-buildpackage -uc -us -d -aarm (略) dpkg-deb: building package `grep' in `../grep_2.5.1.ds1-4_arm.deb'. make: Leaving directory `/root/grep-2.5.1.ds1' dpkg-genchanges dpkg-genchanges: not including original source code in upload dpkg-buildpackage: binary and diff upload (original source NOT included)
通った。
makai:~/grep-2.5.1.ds1# cd .. makai:~# rm -r grep-2.5.1.ds1 makai:~# ar -x grep_2.5.1.ds1-4_arm.deb makai:~# rm control.tar.gz debian-binary makai:~# tar zxvf data.tar.gz makai:~# file ./bin/grep ./bin/grep: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), stripped makai:~# rm -r bin usr data.tar.gz
出来ている。
ただ、実機でテストまではしていないので、本当に動くかどうかはまだわからない。
kernelをビルドしてみる。
Makefileをちょっといじる。
makai:~# tar zxvf kernel.tar.gz makai:~# cd linux-2.6.12.6/ makai:~/linux-2.6.12.6# vi Makefile CROSS_COMPILE ?= $(shell if uname -m|grep arm>&/dev/null; then echo ''; else echo arm-linux-gnu-; fi) makai:~/linux-2.6.12.6# make oldconfig makai:~/linux-2.6.12.6# make ARCH=arm CROSS_COMPILE=arm-linux-gnu-
通っているようだ。
結果は明日のお楽しみ。
つーか、クロスなのにマシン遅いのしかないので、すぐに結果が見られない... orz