クロスコンパイラの新規生成
なぜ新規に生成するのか
すでにSH3用のクロスコンパイラが公開されており、
そのために準備としてセルフコンパイラと同じバージョンのgccのクロスコンパイラを生成します。バージョンは任意でいいですが、
crosstoolの取得
クロスコンパイラは通常の方法ではコンパイルがうまくいかないので、
- crosstool
- URL:http://
kegel. com/ crosstool/
crosstoolのダウンロードは上記のページからたどれる以下のURLとなります。
crosstoolの構築
crosstoolの構築は一般ユーザでなければいけません。まず、
$ tar xvzf crosstool-0.43.tar.gz $ cd crosstool-0.43
いくつかの設定ファイルを変更してから構築をします。SH3用クロスコンパイラの設定はsh3.
01 KERNELCONFIG=`pwd`/sh3.config
02 TARGET=sh3-linux
03 TARGET_CFLAGS="-O -ml -m3"
04 GLIBC_CONFIGPARMS="no-z-defs=yes"
クロスコンパイラの構築のスクリプトはdemo-sh3.
01 #!/bin/sh
02 # This script has one line for each known working toolchain
03 # for this architecture. Uncomment the one you want.
04 # Generated by generate-demo.pl from buildlogs/all.dats.txt
05
06 set -ex
07 TARBALLS_DIR=$HOME/downloads
08 RESULT_TOP=$HOME/crosstool
09 export TARBALLS_DIR RESULT_TOP
10 GCC_LANGUAGES="c,c++"
11 export GCC_LANGUAGES
12
13 # Really, you should do the mkdir before running this,
14 # and chown /opt/crosstool to yourself so you don't need to run as root.
15 mkdir -p $RESULT_TOP
16
17 #eval `cat sh3.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
18 #eval `cat sh3.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
19 #eval `cat sh3.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
20 #eval `cat sh3.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notestko
21 #eval `cat sh3.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
22 #eval `cat sh3.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
23 #eval `cat sh3.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
24 #eval `cat sh3.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
25 #eval `cat sh3.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
26 #eval `cat sh3.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
27 #eval `cat sh3.dat gcc-4.1.0-glibc-2.3.5.dat` sh all.sh --notest
28 eval `cat sh3.dat gcc-4.1.2-glibc-2.3.6.dat` sh all.sh --notest
29
30 echo Done.
リスト2の7行目ではツール類のソースパッケージをダウンロードするフォルダを指定します。場所は任意でかまいません。
リスト2の8行目では生成されたクロスコンパイラをインストールする先のフォルダを指定します。こちらも場所は任意です。
リスト2の28行目でコンパイラとCライブラリの組み合わせ定義ファイルを記述します。定義ファイルが既存のもので用意されている場合はそれを使えばいいですが、
今回はgcc-4.
01 BINUTILS_DIR=binutils-2.16.1
02 GCC_CORE_DIR=gcc-3.3.6
03 GCC_DIR=gcc-4.1.2
04 GLIBC_DIR=glibc-2.3.6
05 LINUX_DIR=linux-2.6.15.4
06 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
07 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
08 GDB_DIR=gdb-6.5
これらの変更が済んだら、
$ ./demo-sh3.sh
このスクリプトは必要なファイルをダウンロードしてから構築しようとしますが、
参考のために必要なファイルは以下のとおりです。
- binutils-2.
16. 1.tar. bz2 - gcc-3.
3.6. tar. bz2 - gcc-4.
1.2. tar. bz2 - glibc-2.
3.6. tar. bz2 - linux-2.
6.15. 4.tar. gz - linux-libc-headers-2.
6.12. 0.tar. bz2 - glibc-linuxthreads-2.
3.6. tar. bz2 - gdb-6.
5.tar. bz2
クロスコンパイラのインストール
クロスコンパイラはシステム領域にあるので、
まず、
# cd /usr # rm -rf sh3-linux
次に新規のクロスコンパイラを以下のようにインストールします。
# cd /usr # cp -a [インストール先フォルダ]/gcc-4.1.2-glibc-2.3.6/sh3-linux .
binutilsの構築
gccにはbinutilsが必要なので、
binutilsのコンパイル
クロスコンパイラと同じく,binutils-2.
$ tar xvjf binutils-2.16.1.tar.bz2 $ cd binutils-2.16.1
以下のように構築をするフォルダを作成します。
$ mkdir build $ cd build
configureでは、
その場合は以下のようにconfigureのオプションを指定し、
$ ../configure --prefix=/usr --host=sh3-linux --build=i686-vine-gnu $ make
binutilsのインストール
configureで指定したインストール先の/usrは組込みボードのフォルダなので、
ここでは~/shlinuxとしますので、
$ mkdir ~/shlinux $ make install prefix=~/shlinux
gccの構築
gccのコンパイル
クロスコンパイラと同じgcc-4.
$ tar xvjf gcc-4.1.2.tar.bz2 $ cd gcc-4.1.2
以下のように構築をするフォルダを作成します。
$ mkdir build $ cd build
binutilsと同じく、
以下のようにconfigureのオプションを指定し、
$ ../configure --prefix=/usr --host=sh3-linux --build=i686-vine-gnu --enable-languages=c,c++ $ make
コンパイルは成功したかのようにエラーも出ませんが、
gccの不完全インストール
configureで指定したインストール先の/usrは組み込みボードのフォルダなので、
$ make install prefix=~/shlinux
前述のとおりCコンパイラの構築が失敗しているので、
/usr/bin/install: 宛先の `/home/general/shlinux/libexec/gcc/sh3-linux/4.1.2/install-tools/mkinstalldirs' はディレクトリではありません /usr/bin/install: `build/fix-header' を stat できません: そのようなファイルやディレクトリはありません make[2]: *** [install-mkheaders] Error 1 make[2]: Leaving directory `/home/general/gcc-4.1.2/build/gcc' make[1]: *** [install-gcc] Error 2 make[1]: Leaving directory `/home/general/gcc-4.1.2/build' make: *** [install] Error 2
何やらインストールでのトラブルのような感じがしますが、
インストール内容の完成
不完全インストールの補完
組み込み用のSH3セルフコンパイラは、
この段階では不完全インストールの状態なので、
不完全なセルフコンパイラを補完するためにクロスコンパイラの内容の一部の持ってきて補完をする条件としては、
ヘッダファイルの補完
Cコンパイラの構築に失敗しているので、
$ cd ~/shlinux $ cp -a /usr/sh3-linux/sh3-linux/include .
gccライブラリの補完
Cコンパイラの構築に失敗しているので、
$ cd ~/shlinux/lib/gcc/sh3-linux/4.1.2 $ cp -a /usr/sh3-linux/lib/gcc/sh3-linux/4.1.2/lib*.a .
Cライブラリの補完
本来はglibc-2.
$ cd ~/shlinux/lib $ cp -a /usr/sh3-linux/sh3-linux/lib/*crt* . $ cp -a /usr/sh3-linux/sh3-linux/lib/ld*so* . $ cp -a /usr/sh3-linux/sh3-linux/lib/lib*.a . $ cp -a /usr/sh3-linux/sh3-linux/lib/lib*so* .
その他の補完
C++コンパイラではC++言語ソースのコンパイルだけでなくC言語ソースのコンパイルもできるようにCコンパイラを兼ねています。前述のとおりC++コンパイラの構築には成功しているので、
$ cd ~/shlinux/bin $ ln -s c++ cc $ ln -s g++ gcc $ ln -s sh3-linux-c++ sh3-linux-cc $ ln -s sh3-linux-g++ sh3-linux-gcc
SH7706ボードへのインストール
ルートファイルシステム再構築
SH7706ボードではルートファイルがSDカード上にあり、
従来とおりにルートファイルシステムでの/lib以下のファイル群は古いクロスコンパイラ由来のファイルなので、
そして、
ただ、
セルフコンパイルの実行
ルートファイルシステム再構築されたSDカードをSH7706ボードに差し込んでからSH7706ボードからLinuxを起動します。
たとえば、
# gcc -o hello hello.c # ./hello hello C #
#include <stdio.h>
int main() {
printf("hello C\n");
}
コンパイルや実行では初回はやや時間がかかりますが、
次回は
次回はGNUの標準パッケージをSH3セルフコンパイルするために整備をします。