クロスコンパイル環境を作る


用意したもの

  1. gcc-2.95.2.tar.gz
  2. binutils-2.10.tar.gz
  3. newlib-1.8.2.tar.gz
  4. gdb-5.0.tar.gz
gcc, binutils, gdbは各地のGNUアーカイブに置いてあります。 http://www.ring.gr.jp/pub/GNUなどからどうぞ。 newlibは、Cygnusのサイトにあります。本家の http://sources.redhat.com/projects.html、またはミラーの ftp://sysg.kek.jp/cygnus/などから取得してください。ファイルサイズは… 相当大きいです。

ホスト環境は、まともなUNIX環境ならどれでも動くと思います。 Cygwinはチェックしてません。


ネイティブなgcc-2.95.2のコンパイル

ホスト環境のCコンパイラが古かったので、まずホスト側のセルフコンパイラ (gcc-2.95.2)を/usr/local/にインストールすることにしました。 このステップは不要かもしれません。
% gzip -dc .../gcc-2.95.2.tar.gz | tar xvf -
% mkdir w0; cd w0
% ../gcc-2.95.2/configure --prefix=/usr/local
% make bootstrap
% sudo make install

最後にsudoコマンドを使ってmake installしていますが、 これはrootでの作業を一時的に行うためのものです。 sudoコマンドのない場合はsuなりsuperなりで代用してください。 インストールしたら、

% rehash
% gcc -v
Reading specs from /usr/local/lib/gcc-lib/i586-pc-linux-gnu/2.95.2/specs
gcc version 2.95.2 19991024 (release)
とインストールしたバージョンが表示されることを確認します。

また、作業のログを残したい場合は、

(Cシェルの場合)
% make bootstrap |& tee make.log
(Bシェルの場合)
% make bootstrap 2>&1 | tee make.log
などとteeコマンドを使うと良いでしょう。

なお、実行・オブジェクトファイルのフォーマットとしてELF、 デバッグ用情報のフォーマットとしてDWARF2を使用することにしました。 別にCOFFでもいいんですが、思ったより"common format"にならなかったのと、 新しいバージョンの日立の純正開発ツールでもELF/DWARF2を採用しているためです。


GNU binutilsのコンパイル

% gzip -dc .../binutils-2.10.tar.gz | tar xvf -
% mkdir w1; cd w1
% ../bin-utils-2.10/configure --prefix=/usr/local --target=sh-elf
% make
% sudo make install
これで/usr/local/sh-elf/bin/以下にSHシリーズ用の アセンブラ、リンカ、アーカイバ、ダンプユーティリティがインストールされます。 これらのコマンドは/usr/local/bin/sh-elf-*としても使えます。

こちらもちょっと確認してみましょう。

% rehash
% sh-elf-objdump --help
Usage: sh-elf-objdump  file(s)
[略]
sh-elf-objdump: supported targets: elf32-sh elf32-shl coff-sh coff-shl coff-sh-small coff-shl-small elf32-little elf32-big srec symbolsrec tekhex binary ihex
Report bugs to bug-gnu-utils@gnu.org
elf32-shと表示されますから、おそらく大丈夫でしょう。 なお、srecはモトローラS、ihexはIntel Hexです。

gccとnewlibの伸長・展開

一般的なUNIXマシンなら、ヘッダファイルやライブラリファイル などがあらかじめシステムに用意されています。 しかしクロスコンパイラの場合、 これらのファイルを自分で用意しなければなりません。 (日立製のクロスコンパイラが使えるので、 そこからパクって……うがぐぐ^^; ←「東芝のネタを使うな」というツッコミは却下)

そこで、newlibという組み込み用のライブラリを使います。 このライブラリには、ANSI C環境で プログラムをコンパイル&実行するために 必要なファイルが入ってます。 newlibは通常のUNIXでいうと、libc(Cライブラリ)やlibgcc(Cヘルパーライブラリ)や crt0.o(Cスタートアップファイル)に相当するものです。 なお、このnewlibは実行コード中に含まれるわけですので、 非個人的用途に使用する場合はライセンス条項にご注意ください。

newlibはgccのディレクトリ内からシンボリックリンクを貼っておき、 第1ステージのクロスコンパイラができた時点でビルドされるようにしておきます。

% gzip -dc .../newlib-1.8.2.tar.gz | tar xvf -
% gzip -dc .../gcc-2.95.2.tar.gz | tar xvf -
% cd gcc-2.95.2
% ln -s ../newlib-1.8.2/newlib .

クロスgccのコンパイル

最初作ったネイティブ用のgccと同じソースツリーを利用してクロスgccを作ります。 C++を使いたい場合は--enable-languages=c,c++とすればいいはずですが、試していません。 なお、この設定ではSHシリーズのうち、デフォルトでSH1用のコードを生成するようになります。 試していませんが、--with-cpu=sh3などとすればデフォルトのターゲットCPUを変えることができるようです。
% mkdir w2; cd w2
% ../gcc-2.95.2/configure --prefix=/usr/local --target=sh-elf --with-gnu-as --with-gnu-ld --with-dwarf2 --disable-multilib --enable-languages=c --with-newlib
コンパイルします。ちょっと時間がかかりますので、 お茶の準備でもしながらどうぞ ^^;
% make
% sudo make install
これもできあがったら確認作業をします。
% rehash
% echo "main(){}" > null.c
% sh-elf-gcc -v null.c
Reading specs from /usr/local/lib/gcc-lib/sh-elf/2.95.2/specs
gcc version 2.95.2 19991024 (release)
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__sh__ -D__ELF__ -D__sh__ -D__ELF__ -Acpu(sh) -Amachine(sh) -D__sh1__ null.c /tmp/ccuaPbr8.i
GNU CPP version 2.95.2 19991024 (release) (Hitachi SH)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/include
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/../../../../sh-elf/include
End of search list.
The following default directories have been omitted from the search path:
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/../../../../include/g++-3
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/../../../../sh-elf/sys-include
End of omitted list.
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/cc1 /tmp/ccuaPbr8.i -quiet -dumpbase null.c -version -o /tmp/ccAjW107.s
GNU C version 2.95.2 19991024 (release) (sh-elf) compiled by GNU C version 2.95.2 19991024 (release).
 /usr/local/sh-elf/bin/as -o /tmp/ccP0iusj.o /tmp/ccAjW107.s
 /usr/local/lib/gcc-lib/sh-elf/2.95.2/collect2 /usr/local/sh-elf/lib/crt0.o -L/usr/local/lib/gcc-lib/sh-elf/2.95.2 -L/usr/local/sh-elf/lib /tmp/ccP0iusj.o -lgcc -lc -lgcc
良さそうですね。ここから分かるのは、 ターゲットCPUがSH2の場合は"-m2"、SH3の場合は"-m3"をつけます。 この場合、若干事前定義シンボルやライブラリのサーチパスが変化します。

gdbのコンパイル

これは特に下準備はいりません。
% mkdir w3; cd w3
% ../gdb-5.0/configure --prefix=/usr/local --target=sh-elf
% make
% sudo make install
% rehash
% sh-elf-gdb --version
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
[略]
This GDB was configured as "--host=i586-pc-linux-gnu --target=sh-elf".

Home Next
card_captor@geocities.co.jp
1