• 差分
  • リロード
  • 一覧
  • 最終更新のRSS

ルネサステクノロジ社のSuperH(SH)マイコン用クロスコンパイラをUbuntuで構築する。

#contents

* はじめに [#l8fea3ef]
クロスコンパイラとは、それが動くマシンとは異なるアーキテクチャの機械語コードを出力するコンパイラのこと。
マイコン用のプログラムを書く場合、マイコン上でコンパイルするのは非現実的なので、PCなどにマイコン用のクロスコンパイラを導入し、そこで機械語コードを生成した上でなんらかの手段でマイコンのEEPROMなどに書き込むというのが一般的である。

大学の研究室では、秋月電子のSH2マイコンボード「[[AKI-SH2/7045F:http://akizukidenshi.com/catalog/items2.php?q=%22K-00206%22&s=score&p=1&r=1&page=]]」を使ってプログラミングをしている。その際使うクロスコンパイラをUbuntuに導入したときの手順を書き留めておく。

* 構築手順 [#ca9098d5]
** 必要パッケージとソースコード [#m1e9f968]
まず、クロスコンパイラのソースをコンパイルするために必要となるパッケージをインストールする。

 $ sudo apt-get install libc6-dev gcc-3.4

その後、以下のソースコードをそれぞれダウンロードする。
- binutils-2.14 ( ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz )
- gcc-3.4.6 ( ftp://ftp.gnu.org/gnu/gcc/gcc-3.4.6/gcc-core-3.4.6.tar.gz )
- newlib-1.10.0 ( ftp://sources.redhat.com/pub/newlib/newlib-1.10.0.tar.gz )

バージョンの組み合わせ次第でうまくいったりいかなかったりするようだ。

ダウンロードしたら適当なところにuntarしておく。例えばここでは、/home/userに解凍することにする。
 $ cd /home/user
 $ tar zxf binutils-2.14.tar.gz
 $ tar zxf gcc-core-3.4.6.tar.gz
 $ tar zxf newlib-1.10.0.tar.gz

インストールは全てroot権限で行った方が余計なトラブルに遭うことなく進む。
 $ sudo su
以降はrootであることを前提に作業を進める。

** binutilsをインストール [#xfca9e5f]
コンパイル時にコンパイラのバージョンを明示的に指定する必要がある。

 # mkdir binutils_tmp
 # cd binutils_tmp
 # ../binutils-2.14/configure --prefix=/usr/local/sh_cross_3.4.6 --target=sh-coff
 # make CFLAGS=-O2 CC=gcc-3.4
 # make install
 # cd /usr/local
 # sudo ln -s sh_cross_3.4.6 sh_cross

** gccをインストール [#g7fa1779]
non-rootユーザでconfigureをしてコンパイルしたところエラーが出たので、
configureからきちんとrootユーザで作業をしたほうがよい。

 # cd /home/user
 # mkdir gcc-3.4.6_tmp
 # cd gcc-3.4.6_tmp
 # export PATH=$PATH:/usr/local/sh_cross/bin
 # ../gcc-3.4.6/configure --prefix=/usr/local/sh_cross_3.4.6 --target=sh-coff --with-newlib --with-headers=../newlib-1.10.0/newlib/libc/include --enable-languages=c
 # make CFLAGS=-O2 CC=gcc-3.4
//
//すると、次のようなコンパイルエラーを吐いてmakeが停止する。
// In file included from ../../gcc-3.4.6/gcc/libgcc2.c:41:
// ../../gcc-3.4.6/gcc/tsystem.h:79:19: stdio.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:82:23: sys/types.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:85:19: errno.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:92:20: string.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:93:20: stdlib.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:94:20: unistd.h: No such file or directory
// ../../gcc-3.4.6/gcc/tsystem.h:100:18: time.h: No such file or directory
// make[2]: *** [libgcc/./_muldi3.o] Error 1
// make[2]: Leaving directory `/home/toshio/gcc-3.4.6_tmp/gcc'
// make[1]: *** [stmp-multilib] Error 2
// make[1]: Leaving directory `/home/toshio/gcc-3.4.6_tmp/gcc'
// make: *** [all-gcc] Error 2
//
//ヘッダファイルが見付からないということなので、
//以下のようにしててきとーにヘッダファイルをつっこんでやったらうまくいった。
//本当に正しいのかいまいち釈然としないが・・・。
//
// $ cd ~/gcc-3.4.6_tmp
// $ cp -r stdio.h sys/ errno.h string.h stdlib.h unistd.h time.h _ansi.h machine/ alloca.h gcc/
//
//コンパイルが通ったらインストールする。
 # make install

** newlibインストール [#weac773f]
 # cd
 # mkdir newlib_tmp
 # cd newlib_tmp
 # ../newlib-1.10.0/configure --prefix=/usr/local/sh_cross_3.4.6 --target=sh-coff --norecursion
// # export PATH=$PATH:/usr/local/sh_cross/bin
 # make CFLAGS=-O2 CC=gcc-3.4
 # make install

** パスにクロスコンパイラを追加 [#l79c2944]
以上の手順でクロスコンパイラの導入が完了したはずである。
あとはクロスコンパイラの実行ファイルをパスに追加して終了。

 $ echo 'export PATH=$PATH:/usr/local/sh_cross/bin' >> ~/.bash_profile

* コンパイラスイッチ [#u0246927]
SuperH用gccはコンパイラスイッチによってSuperHのシリーズを指定することができる。
先に紹介したSH2シリーズなら、
 $ sh-coff-gcc -m2
とする。