============================================================================== Zaurus SL-B500 でセルフコンパイル環境を作ってみる。 たなかとしひさ(tosihisa@netfort.gr.jp) 最終更新:$Date: 2003/01/09 10:26:20 $ ============================================================================== Zaurus SL-B500 向けに、セルフコンパイル環境を作ってみます。 この文書は*無保証*です。あくまで、私自身が試した事について書いています。 この文書に書かれている事を実行する事により、お使いの Zaurus 環境に何か支障が 発生しても、責務を負う事は出来ません。 Table of Contents 1.予備知識 1-1.セルフコンパイル環境・クロスコンパイル環境の違い 1-1-1.セルフコンパイル環境とは 1-1-2.クロスコンパイル環境とは 2.ダウンロード(dev_img-1.3) 3.インストール 4.Hello World! 5.使っていく上で 5-1.スワップ領域 5-2./tmp 溢れ 6.謝辞 ============================================================================== 1.予備知識 1-1.セルフコンパイル環境・クロスコンパイル環境の違い 1-1-1.セルフコンパイル環境とは セルフコンパイルとは、プログラムを実行させたいコンピュータと、そのプログラムを コンパイルするコンピュータが __同じアーキテクチャ(CPU + OS)__ である場合、 「セルフコンパイル」と表現します。 従って、必要となるコンピュータは最低1台だけです。 1-1-2.クロスコンパイル環境とは クロスコンパイルとは、プログラムを実行させたいコンピュータ(ターゲットと表現され ます)と、そのプログラムをコンパイルするコンピュータが __異なるアーキテクチャ(CPU + OS)__ である場合、「クロスコンパイル」 と表現しま す。 これは、組込み分野でよく用いられる手法です。 従って、この場合、必要となるコンピュータは、 (1) プログラムを実行させたいコンピュータ(ターゲット) (2) そのプログラムをコンパイルするコンピュータ の2台が最低必要となります。 「セルフ・クロス」の呼びわけについては、概ね、CPU と OS が同じなら「セルフ」、 CPU と OS のどちらかが異なれば、「クロス」と分けられています。 #あくまで一般的な呼び分けです。 例えば、IBM-PC なパソコンに、Linux をインストールし、その IBM-PC 上で、Zaurus SL シリーズ向けのプログラムがコンパイルできる環境を作る場合は、OS は同じ Linux でも、ターゲット CPU が異なりますので、「クロスコンパイル環境を作る」 事になります。 ============================================================================== 2.ダウンロード Zaurus SL-B500 で使えるセルフコンパイラ(dev_img-1.3)は、以下の URL から取得します。 http://prdownloads.sourceforge.net/zaurus/dev_img-1.3?download dev_img-1.3 は、gcc を初めとした、セルフコンパイル環境一式が、cramfs イメージで*そのままの形で*あるものです。 dev_img-1.3 がダウンロードできたら、Zaurus の CF カードか SD カードに保存して おきます。 dev_img-1.3 は、CF カード、SD カードのどちらに置いても問題無いはずです。 (正しくマウントできる位置にあれば OK のはずです) 私は、SD カード上(/mnt/card)に、dev_img-1.3 を保存しました。 ============================================================================== 3.インストール *****以下の作業は、すべて Zaurus 上で行ないます***** dev_img-1.3 は、いわゆる Zaurus のパッケージ形式では配布されていませんので、 ターミナルを起動して、手動でインストールする必要があります。 もし、すでに Zaurus 側で、in.telnetd 等を起動しており、リモートログインでき る状態であれば、リモートログインで作業すると楽に進むと思います。 (1) Zaurus でターミナルを起動したら、適当なディレクトリを作成し、そのディレ クトリに dev_img-1.3 をマウントします。私は、/home/userdata/dev ディレク トリを作成し、そこにマウントしました。 もし、/home/userdata/dev とは異なるディレクトリにマウントさせたい場合、 以下の "/home/userdata/dev" は、全てそのディレクトリ名に置き換えてくだ さい。 # mkdir /home/userdata/dev # mount -o loop,rw -t cramfs dev_img-1.3 /home/userdata/dev/ これで、dev_img-1.3 の中身が、/home/userdata/dev 以下で見られます。 bash-2.05# ls -al /home/userdata/dev/ drwxr-xr-x 1 501 245 628 Jan 1 1970 bin drwxr-xr-x 1 501 245 9728 Jan 1 1970 docs drwxr-xr-x 1 501 245 3208 Jan 1 1970 include drwxr-xr-x 1 501 245 396 Jan 1 1970 lib drwxr-xr-x 1 501 245 52 Jan 1 1970 usr (2) これだけでは、まだコンパイルできる状態ではありませんので、 /home/userdata/dev/bin/compiler_setup.sh を実行します。これにより、 ザウルスのメインメモリー側のファイルシステムに、いくつかのシンボリック リンクが張られ、コンパイルできる状態になります。 /home/userdata/dev/bin/compiler_setup.sh には、引数として、マウント 先のディレクトリ(私の場合は、/home/userdata/dev)を渡します。これに より、シンボリックリンクで張り巡らされるファイルの向き先が、マウント したディレクトリを向くようになります。 bash-2.05# /home/userdata/dev/bin/compiler_setup.sh -r /home/userdata/dev linking You are now set up for dev using /home/userdata/dev bash-2.05# これで、コンパイラ(gcc)が必要とするライブラリなどが、見える状態になり ます。 (3) 環境変数 PATH に、/home/userdata/dev/bin を追加しておきます。 # export PATH=$PATH:/home/userdata/dev/bin これで、gcc が動作するはずです。試しに、バージョンを表示させてみます。 bash-2.05# gcc --version 2.95.1 bash-2.05# gcc が動作する事が確認できました。 ============================================================================== 4.Hello World! インストールが出来たら、簡単なテストプログラムを書いてみる事にします。 まぁ、ここは月並みに...(^^;;; /* ---[test.c]--- */ #include void main(void) { printf("Hello World\n"); } プログラムが書けたら、Zaurus 上でコンパイルしてみましょう。gcc は、-v オプションを追加する事で、各種情報を表示しますので、-v オプションを 追加して、動作を見てみる事にします。 bash-2.05# gcc -o test.out -v test.c ← 入力 Using builtin specs. ↓以下全て表示 gcc version 2.95.1 19990816 (release) /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/cpp -lang-c -v -D__GNUC__=2 -D__GNU C_MINOR__=95 -Dunix -Darm -Dlinux -D__ELF__ -Darm_elf -D__unix__ -D__arm__ -D__l inux__ -D__ELF__ -D__arm_elf__ -D__unix -D__arm -D__linux -D__arm_elf -Asystem(u nix) -Asystem(posix) -Acpu(arm) -Amachine(arm) -D__CHAR_UNSIGNED__ -D__ARM_ARCH_ 4__ -D__APCS_32__ test.c /tmp/ccrKTZu7.i GNU CPP version 2.95.1 19990816 (release) (ARM GNU/Linux with ELF) #include "..." search starts here: #include <...> search starts here: /usr/local/include /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/include End of search list. The following default directories have been omitted from the search path: /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/../../../../include/g++-3 /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/../../../../armv4l-redhat-linux/inc lude /usr/include End of omitted list. /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/cc1 /tmp/ccrKTZu7.i -quiet -dumpbas e test.c -version -o /tmp/ccIMNNpf.s GNU C version 2.95.1 19990816 (release) (armv4l-redhat-linux) compiled by GNU C version 2.95.1 19990816 (release). test.c: In function `main': test.c:5: warning: return type of `main' is not `int' as -o /tmp/ccWzyQ4q.o /tmp/ccIMNNpf.s /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/collect2 -dynamic-linker /lib/ld-li nux.so.2 -X -m armelf_linux -p -o test.out /usr/lib/gcc-lib/armv4l-redhat-linux/ 2.95.1/crt1.o /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/crti.o /usr/lib/gcc-li b/armv4l-redhat-linux/2.95.1/crtbegin.o -L/usr/lib/gcc-lib/armv4l-redhat-linux/2 .95.1 /tmp/ccWzyQ4q.o -lgcc -lc -lgcc /usr/lib/gcc-lib/armv4l-redhat-linux/2.95. 1/crtend.o /usr/lib/gcc-lib/armv4l-redhat-linux/2.95.1/crtn.o bash-2.05# 特にエラーは無さそうです。では、コンパイルして出来た、test.out を実行させてみます。 bash-2.05# ./test.out Hello World bash-2.05# これで、Zaurus 上で、コンパイルできる環境が出来上がりました。 もし、今後も、この環境を使うなら、/etc/fstab を修正して、起動時 に /home/userdata/dev にマウントするようにしておくと良いかなと思 います。 ============================================================================== 5.使っていく上で 5-1.スワップ領域 私自身も、gcc を入れたばかりですが、gcc で各種ソースをコンパイルすると、 規模によってはメモリ不足になりますので、Zaurus にスワップファイルを用意 してスワップさせるか、あるいは CFカードまたは SD カードに、スワップパー ティションを用意した方が良いでしょう。 5-2./tmp 溢れ Zaurus でセルフコンパイルする場合、/tmp 領域が溢れる場合があります。 調べてみると、SL-B500 の場合、/tmp が 1MB 程度しかない??ので、大きい ソースをコンパイルする場合、溢れる可能性があります。 #gcc(cpp / cc1)は、中間ファイルを /tmp に作ります。 この様な場合は、 # mkdir /mnt/card/tmp # export TMP=/mnt/card/tmp 上記の様に、環境変数 TMP に値を指定する事で、中間ファイルを /tmp で はなく、/mnt/card/tmp に作成するようになります。 ============================================================================== 6.謝辞 このテキストに関して、linux-zaurus ML に参加されている方々から、各種 フォローを頂きました。この場を借りてお礼申し上げます m(_ _)m。 ==============================================================================