12ステップで作る組込みOS自作入門」を購入して、取り組み始めました。

まずは開発環境の構築からです。
PCはUbuntuがあるので、こちらを使用します。

クロスコンパイル環境の作成が必要なので、自分でビルドしていきたいと思います。

  • binutils
  • gcc

最新版を用いて行ったのでバージョンは以下になります。

  • binutils-2.32
  • gcc-9.2.0

binutilsのインストール

https://www.gnu.org/software/binutils/より
現在の最新版binutils-2.32.tar.gzをダウンロードしてくる。
解凍し、H8のクロス開発用にビルド、インストールします。

tar xzvf binutils-2.32.tar.gz
 ./configure  --target=h8300-elf --disable-nls
 make
 sudo make install

インストール完了すると、/usr/local/bin/階層にh8300-elf*という名前でインストールされているのがわかります。

ls /usr/local/bin
 h8300-elf-addr2line  h8300-elf-elfedit  h8300-elf-nm       h8300-elf-readelf
 h8300-elf-ar         h8300-elf-gprof    h8300-elf-objcopy  h8300-elf-size
 h8300-elf-as         h8300-elf-ld       h8300-elf-objdump  h8300-elf-strings
 h8300-elf-c++filt    h8300-elf-ld.bfd   h8300-elf-ranlib   h8300-elf-strip

gccのインストール

https://gcc.gnu.org/より
現在の最新版gcc-9.2.0.tar.gzをダウンロードします。
解凍して、H8のクロス開発用にビルド、インストールします。

tar xvzf gcc-9.2.0.tar.gz
cd gcc-9.2.0/
./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c

ビルドでエラーしました。
このあと、いくつかエラーでハマりました。

configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify their locations.

GMP, MPFR, MPCのバージョンがあっていないというエラーが出ています。
GMP, MPFR, MPCの最新版をインストールして解決しました。

GMP

https://gmplib.org/より
最新版gmp-6.1.2.tar.lzをダウンロード。
ビルドとインストールをします。

tar --lzip -xvf gmp-6.1.2.tar.lz
cd gmp-6.1.2/
./configure --prefix=/usr/local
make
sudo make install

GMPのビルドでの備忘録

gmp-6.1.2.tar.lzとlzip形式で圧縮されているのため、lzipのインストールが必要でした。
Ubuntuにlzipをインストールしました。

sudo apt-get install lzip
ビルドするさい、以下のエラーが出ました。
checking for suitable m4… configure: error: No usable m4 in $PATH or /usr/5bin (see config.log for reasons).
m4がないとビルドできないみたいなので、インストールしてエラー回避しています。
sudo apt-get install m4 m4-doc
### MPFR より 最新版mpfr-4.0.2.tar.gzをダウンロード。 ビルドとインストールをします。
tar -xvzf mpfr-4.0.2.tar.gz
cd mpfr-4.0.2/
./configure --prefix=/usr/local
make
sudo make install

MPC

http://www.multiprecision.org/mpc/より
最新版mpc-1.1.0.tar.gzをダウンロード。
ビルドとインストールをします。

tar -xvzf mpc-1.1.0.tar.gz
cd mpc-1.1.0/
./configure --prefix=/usr/local
make
sudo make install

isl

gccのビルド途中で以下のようなメッセージが出ていました。

required isl version is 0.15 or later
より 最新版isl-0.21.tar.gzをダウンロード。 ビルドとインストールをします。
./configure --prefix=/usr/local
make
sudo make install

islのインストール後に、gccのビルドしたら以下エラーが出ました。

error while loading shared libraries: libisl.so.21: cannot open shared object file: No such file
インストールしたばかりだとライブラリが参照できないようです。 以下コマンドで動的リンカによる実行時の結合関係を設定すれば解決しました。
sudo ldconfig
### 再度gccのコンパイルを実行
cd gcc-9.2.0/
./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c

以下のエラーが発生しました。

./.././gcc/libgcc.mvars: そのようなファイルやディレクトリはありません
調べてみるとディレクトリを変えるビルドするディレクトリを変える必要があるようでした。 gccディレクトと同階層にbuildというディレクトリを作って実行します。
mkdir build
cd build
../gcc-9.2.0/configure  --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c
make

また別のエラーが出てきました。

../../../libssp/ssp.c:93:12: warning: implicit declaration of function 'open' [-Wimplicit-function-declaration]
   93 |   int fd = open ("/dev/urandom", O_RDONLY);
      |            ^~~~
../../../libssp/ssp.c:93:34: error: 'O_RDONLY' undeclared (first use in this function)
   93 |   int fd = open ("/dev/urandom", O_RDONLY);
      |                                  ^~~~~~~~
省略
../../../libssp/ssp.c:192:14: note: include '<string.h>' or provide a declaration of 'strlen'
make[3]: *** [Makefile:575: ssp.lo] エラー 1

調べたところ、sspは必要ないようです。

./configureに--disable-libsspオプションをつければ良いようです。
../gcc-9.2.0/configure   --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --disable-libssp
make
sudo make install

これで無事にgccのH8用クロス環境をインストールできました。

参考サイト

http://tokis.cocolog-nifty.com/blog/2014/05/kozosgcc-490w-1.html
https://yohgami.hateblo.jp/entry/20130502/1367508997
https://blog.wataridori.co.jp/2017/12/post-370/