まずは何よりGCC

シリアルケーブルはどうするのか、その辺りは取り敢えず放っておいて、ソフ トウェア開発環境の構築に走ってみることにしよう。で、手元にあるbinutil とgccは、

binutils-2.9.1.tar.gz
gcc-2.95.2.tar.gz
である。これらをFreeBSD 4.2-RELEASE上でmakeする。

  1. binutilsのmake
  2. gccのmake
  3. 開発環境完成の(不十分な)確認

1. binutilsのmake

特別なことは無い。適当な作業ディレクトリで以下のようにやった。プロンプ ト"%"は一般ユーザ、"#"はrootでの作業を示す。
% tar xzf binutils-2.9.1.tar.gz
% cd binutils-2.9.1
% ./configure --target=sh-hitachi-elf --prefix=/usr/local
elfにしとけば多分問題無いだろう。後はmakeあるのみ。但し、例によってGNU の成果物のmakeには、やはりGNU makeが必要なので、packagesから入れたgmake を使う。
% gmake
一発でOK。後はinstallあるのみ。
# gmake install
これで、/usr/local/bin以下に"sh-hitachi-elf-*"なバイナリが入り、 /usr/local/sh-hitachi-elf以下にリンカスクリプト等が入った。私は貧乏性 ("性"に限らないけど…)なので、/usr/local/bin/で、
% strip sh-hitachi-elf-*
も忘れず実行。これでbinutilsのインストールは完了。

2. gccのmake

これは"一発"という訳には行かない。
% tar xzf gcc-2.95.2.tar.gz
% cd gcc-2.95.2
% ./configure --target=sh-hitachi-elf --prefix=/usr/local
までは同じである。しかし、ここで手作業をしなければならない。 gcc-2.95.2/gcc/Makefileにちょっと手を加えるのである。-Dinhibit_libcと 書き加えるだけ。変更点を以下に示す。
355: LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS)
$(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS)
-DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED
↑これを↓こうする。(注: 表示上複数行に渡っている様に見えるが、実際は 一行のもの。また、"355:"は便宜的に書いた行番号。)
355: LIBGCC2_CFLAGS = -O2 -Dinhibit_libc $(LIBGCC2_INCLUDES) $(GCC_CFLAGS)
$(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS)
-DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  
これをやらないと、makeに失敗する。この効果は、標準ライブラリの作成(を しようとして、ファイルの不足から失敗するの)を抑止することだと思うが、 良く調べた訳でもないので、結果については(他と同様)なんら保証出来ない。 また、このファイルは./configureをする度に書き換えられるので注意が必要 である。 あとは楽々。
% gmake LANGUAGES="c"
# gmake LANGUAGES="c" install
これで/usr/local/binに、
sh-hitachi-elf-gcc
が出来た。基本的には-nostdlibで使うので要らないのだが、 /usr/local/sh-hitachi-elfに空のlibc.aを作っておくのも一興である。
# cd /usr/local/sh-hitachi-elf/lib
# sh-hitachi-ar rc libc.a
何の意味が有るのか?と問われると、答えはない。

3. 開発環境完成の確認

さて、これでgccでDreamCastのプログラムを作成する最低限の環境が出来た筈 である。なんとかそれを確認しよう。何か適当なソースはないか?そうそう、 Marcus氏のサイトにあるサンプルでもmakeしてみようか。 やはりDreamCastでやるのだから、グラフィックスを使ったサンプルがイイ。 そんな訳でtatest.tar.gzをやってみよう。
% tar xzf tatest.tar.gz
% cd tatest
% make
sh-elf-as -little  -o startup.o startup.s
sh-elf-as:No such file or directory
*** Error code 1

Stop in /usr/home/m-arai/work/DC/tatest.
%
あら、失敗した。そうか、sh-elf-*になっているんだな。そーいや、別にベン ダ名なんか付けなくても良かったんだ。対策としては、作り直すかリンクを作 るかすればいいのだが、ここはさっさとMakefileを変更する。 /sh-/s//sh-hitachi-/だ。
% make
sh-hitachi-elf-as -little  -o startup.o startup.s
sh-hitachi-elf-gcc -ml -m4-single-only -mhitachi -O -pipe -c main.c
sh-hitachi-elf-as -little  -o matrix.o matrix.s
sh-hitachi-elf-gcc -ml -m4-single-only -mhitachi -O -pipe -c ta.c
sh-hitachi-elf-gcc -ml -m4-single-only -mhitachi -O -pipe -c video.c
sh-hitachi-elf-gcc -ml -m4-single-only -mhitachi -o tatest.srec -Wl,--oformat,srec,-Ttext=0x8c010000 
-nostartfiles -nostdlib startup.o main.o matrix.o ta.o video.o -lgcc -lc -lgcc
%
tatest.srecが出来た。これで、C(とアセンブラの)プログラムから実行可能バ イナリを作る環境が確認出来た!(…その出来たバイナリがちゃんと動くとい う確認はまだだけど…それが出来なくて何の意味がある!という意見は黙殺)

そうそう、それに、sh-hitachi-elf-objdumpを使ってdisassembleも出来るん だ。

% sh-hitachi-elf-objdump -D -b srec -EL -m sh4 tatest.srec > tatest.s
srecとかのsymbolが無くなっているオブジェクトが相手だと、ちょっと分 かり難い出力になってしまうけど。まぁ、何かの役には立つだろう。