"まずプログラムを動かすには"と大きくタイトルを書いてみたが、そんなこと全部知るのは大変そうだ。
それなので、本章で扱う観点でH8の動かせないハード制約をまず把握する。

制約1:CPUはメモリ上にあるプログラムしか実行しない。
[コメント]機械語コードは少なくともメモリ上に展開してあげないといけないということと理解。

制約2:メモリ上の情報の分類として以下が必要。
 ①テキスト領域…CPUが実行する機械語コードが置かれる
 ②データ領域…初期値を持つ静的変数などが置かれる
 ③BSS領域…初期値をもたない静的変数などが置かれる
[コメント]3領域あると急にいわれてもよくわからないが、CPUが処理を実施するのに3領域ある方が何かと都合がいいのだろう。なんていってみるものの、CPUのことも良く知らないのでなんともいえないがとりあえず3領域を意識することが必要そうだ。


まとめると、H8のメモリ上には3領域用意し、その領域に上記に示した分類の情報を配置してやる必要がありそうだ。



それっじゃ、どうすればいいんだ!!



実行形式ファイルがどのように構成されているかの理解がさらに理解するためのカギを握るようである。



実行形式ファイルはELF形式というものであるが、先日それを作成するためのgccコマンドをやっと作れた!
ELF形式の内容構成をながめながら、メモリに置かれるべき3領域に対応した情報はどこからきて、どのようなもので、そしてどのようにメモリに置くのかを見ていくことにする。
binutilsとgccのインストールがやっとできた。

実施する作業は同じでも、場合場合で出てくるメッセージの内容が違うので、環境構築って大変。

恐らく筆者の坂井さんはCygwin環境で実施すると複雑度が1つ増えて問題解決の道のりが複雑になることを把握されているのかもしれない。Cygwin環境の開発はお薦めしていなさそう。


[教訓]
①本で記述されているバージョンを使用する。
②筆者がお薦めしていないCygwinがらみで問題が起きたらCygwinを再インストールする。
③天の声は貴重だ。


[作業内容]
①binutilsをインストールする

1.Makefileを作成する。
./configure --target=h8300-elf --disable-nls --disable-werror

2.makeを実施する。
make

エラーが出てくる。

make[4]: *** [size.exe] Error 1
make[4]: Leaving directory `/tmp/binutils-2.21/binutils'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/tmp/binutils-2.21/binutils'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/tmp/binutils-2.21/binutils'
make[1]: *** [all-binutils] Error 2
make[1]: Leaving directory `/tmp/binutils-2.21'
make: *** [all] Error 2

これを解決するために次に取った対策はバージョンを変更してみることだった。
本で紹介されていたbinutils-2.19.1を使用した。
そしたら旨く行った。

他にもいろいろエラーが出て、1つ1つ記憶していないが、CD-ROMのCygwinを再インストールすることでなぜか知らないがエラーがなくなった。

3.インストールする。
make install
うまくいった。


H8のCD-ROMで作成したCygwin環境だとbinutils-2.21はmakeできないことがわかった(経験上だが)。より新しいバージョンのbinutilsを扱おうと思ったのだが、無理。。



②gccのインストール

1.Makefileを作成する。結果OK。
./configure --target=h8300-elf --disable-nls --disable-threads --disable-werror --disable-shared --enable-languages=c --disable-werror

2.makeを実施する。結果OK。
make

3.インストールする。結果NG。
make install

ここでダメ、以下の様なエラーが出てくる。
/usr/bin/install: permission denied
make[1]: *** [install-common] Error 1
make[1]: Leaving directory `/tmp/gcc-3.4.6/gcc'
make: *** [install-gcc] Error 2

/usr/bin/installのパーミッションが駄目だというのでのぞいてみるが
-rwxr-xr-x で問題なさげ。

ググってみるがどうも解決方法が分からない。
ということでkatata氏の天の声をGET。
問題解決観点としてkatata氏が提案したのは、binutilsがなぜmake install成功したかという観点だった。

binutilsのMakefileのINSTALLという変数に注目すると以下の記載。
INSTALL = /tmp/binutils-2.19.1/install-sh -c

一方、gccのMakefileのINSTALLを注目すると以下。
INSTALL = /usr/bin/install -c

gccはエラーで使えないというのだからbinutilsで使用しているのを採用してみればということで試してみる。
gccのMakefileのINSTALLを以下のように書き換えた。
INSTALL = /tmp/binutils-2.19.1/install-sh -c

make installしたら大成功。


早速ELFファイルが作成可能かの確認を実施。
readelf -a kzload.elf

ちゃんとelf形式になっている。

OS自作してみる。-gccinstall

やっと終わった、、かもしれない。
筆者の坂井さんから天の声いただきました。
たしか風邪ひいていた時環境をエイッてつくったからぬかりがあったかも。
メールの内容紹介。





坂井です。

以下ですが、マイコンボード付属のCD-ROMに収録されているコンパイラ(h8300-hms-gcc)を利用しているということはないでしょうか。

バイナリを見たところ、ELFでなくCOFF形式になっているような気がします。
バイナリのフォーマットはfileコマンドで確認できます。
% file kzload.elf
のようにして確認してみてください。

CD-ROM付属のコンパイラ(binutils,gcc)を利用すると、フォーマットはELFでなくCOFFという形式になります。ブートローダーは作成できるのですが、この場合、以下の欠点があります。
(たしか書籍中でも言及していたように思います)

・readelfで解析できない
・ブートローダーは作成できるが、OSが作成できない
 (正確にいうと、OS作成はできるがブートローダーでロードできないので利用できない。これは本書で作成するブートローダーが、ELFにしか対応していないためです)

この場合、6ステップ以降になると実践できなくなってしまいますので、書籍中で説明してある方法でクロスコンパイラを作成する必要があるように思います。