このページは「24環境」の情報です

第9回 クロス開発ツールをソースからビルドする

海老原祐太郎
2002/9/25

ここではクロス開発ツール (sh3-linux-asやsh3-linux-gcc)をソースからビルドして、
手順を確認してみます。

いずれも 2002-09-25 現在の バージョンでの確認です。

binutils 2.11.92
gcc 3.0.3

ディレクトリ構成

本来、自分でソースから make, make install したソフトウェア郡は /usr/local にインストール
することになっているのですが、.deb パッケージからツールチェインをインストールした場合と
結果を同じくするために /usr/local/sh3-linux ではなく /usr/sh3-linux にインストールするようにします。

これがキモチワルイと考える方は /usr としているところを全て /usr/local に置き換えてください。
ただし 海老原は /usr/local では試していません。

/usr/sh3-linux がクロス開発ツールのベースディレクトリになります。

/usr/sh3-linux/bin
クロスコンパイルツールがインストールされる
/usr/sh3-linux/lib
クロスのライブラリ
/usr/sh3-linux/include
クロスライブラリのヘッダー

になります。

binutils 

binutils (アセンブラ、リンカー)のコンパイルは比較的簡単です。

必要なもの
ftp://ftp.m17n.org/pub/dodes/debian/crosstools/ もしくは
・CDROM /cross-tool/source
から
・binutils-sh-linux_0.dodes.20011207.orig.tar.gz

どこか作業ディレクトリで
$ tar xzfv binutils-sh-linux_0.dodes.20011207.orig.tar.gz
$ cd binutils-sh-linux.orig
$ bzip2 -d src.tar.bz2
$ tar xfv src.tar
$ cd src
$ mkdir build
$ cd build
$ ../configure --disable-nls --target=sh3-linux --prefix=/usr
$ make
# make install

確認

$ ls -l /usr/bin/sh3-linux-*
-rwxr-xr-x    1 root     root       322412 12月  6  2001 /usr/bin/sh3-linux-addr2line
-rwxr-xr-x    2 root     root       298188 12月  6  2001 /usr/bin/sh3-linux-ar
-rwxr-xr-x    2 root     root       440108 12月  6  2001 /usr/bin/sh3-linux-as
-rwxr-xr-x    2 root     root        67224  1月 11  2002 /usr/bin/sh3-linux-c++
-rwxr-xr-x    1 root     root        52204 12月  6  2001 /usr/bin/sh3-linux-c++filt
-rwxr-xr-x    2 root     root        67224  1月 11  2002 /usr/bin/sh3-linux-g++
-rwxr-xr-x    1 root     root        41388 12月  6  2001 /usr/bin/sh3-linux-gasp
-rwxr-xr-x    1 root     root        66104  1月 11  2002 /usr/bin/sh3-linux-gcc
-rwxr-xr-x    2 root     root       499436 12月  6  2001 /usr/bin/sh3-linux-ld
-rwxr-xr-x    2 root     root       331212 12月  6  2001 /usr/bin/sh3-linux-nm
-rwxr-xr-x    1 root     root       450700 12月  6  2001 /usr/bin/sh3-linux-objcopy
-rwxr-xr-x    1 root     root       470604 12月  6  2001 /usr/bin/sh3-linux-objdump
-rwxr-xr-x    2 root     root       298188 12月  6  2001 /usr/bin/sh3-linux-ranlib
-rwxr-xr-x    1 root     root       154476 12月  6  2001 /usr/bin/sh3-linux-readelf
-rwxr-xr-x    1 root     root       278956 12月  6  2001 /usr/bin/sh3-linux-size
-rwxr-xr-x    1 root     root       279116 12月  6  2001 /usr/bin/sh3-linux-strings
-rwxr-xr-x    2 root     root       450700 12月  6  2001 /usr/bin/sh3-linux-strip
$ ls -l /usr/sh3-linux/bin/
-rwxr-xr-x    2 root     root       298188 12月  6  2001 ar
-rwxr-xr-x    2 root     root       440108 12月  6  2001 as
-rwxr-xr-x    2 root     root       499436 12月  6  2001 ld
-rwxr-xr-x    2 root     root       331212 12月  6  2001 nm
-rwxr-xr-x    2 root     root       298188 12月  6  2001 ranlib
-rwxr-xr-x    2 root     root       450700 12月  6  2001 strip

例えば as は sh3-linux-as と /usr/sh3-linux/bin/as が同じファイルと思われますが、
symlinkになっていないのは謎です。(A^^;

sh3-linux-gcc

sh3-linux-gcc のコンパイルは結構大変です。
前提として sh3-linux-gccのコンパイルには sh3用のCライブラリが必要になります。 まずは、 sh3用のCライブラリをインストールする必要があります。
その他にも 以下のツールが必要なのであらかじめインストールしておきます。

m4, autoconf (>= 2.13), libtool, gawk, dejagnu (>= 1.4), bzip2
gperf (>= 2.7-3), bison, flex, gettext, texinfo, zlib1g-dev, debhelper (>= 2.0.50)
(debhelper は debianホストの時のみ)

【手順1】 sh3用のCライブラリのインストール

本来 「sh3マシンにインストールする」
libc6_2.2.4-7.dodes.0_sh3.deb と libc6-dev_2.2.4-7.dodes.0_sh3.deb を「ホスト機に」インストールします。

必要なもの
ftp://ftp.m17n.org/pub/dodes/debian/targets/binary-sh3/
CDROM /debian-for-sh/2002-07-21/binary-sh3
から
libc6_2.2.4-7.dodes.0_sh3.deb
libc6-dev_2.2.4-7.dodes.0_sh3.deb

Debianホストの場合

debianホストの場合は dpkg-cross ツールを使ってパッケージとしてインストールします。

# apt-get install dpkg-cross

/etc/dpkg/cross-compile を編集

#default_arch = m68k
default_arch = sh3

#crossbase = /usr/local
crossbase = /usr
$ cd /tmp
$ dpkg-cross -ash3 -b libc6_2.2.4-7.dodes.0_sh3.deb     ←パッケージの形をコンバートする
$ dpkg-cross -ash3 -b libc6-dev_2.2.4-7.dodes.0_sh3.deb
# dpkg -i libc6-sh3-cross_2.2.4-7.dodes.0_all.deb       ←インストール
# dpkg -i libc6-dev-sh3-cross_2.2.4-7.dodes.0_all.deb
$ rm libc6*.deb

非debianホストの場合

非debian機の場合は dpkg-cross が使えないので
libc6_2.2.4-7.dodes.0_sh3.deb と libc6-dev_2.2.4-7.dodes.0_sh3.deb を
手作業でバラしてインストールします。

インストール先のディレクトリの準備
# mkdir /usr/sh3-linux
# mkdir /usr/sh3-linux/lib
# mkdir /usr/sh3-linux/include
どこか作業ディレクトリで
$ cd /tmp
まずは libc6-sh3 の展開&インストール
$ mkdir libc6-sh3
$ cd libc6-sh3
$ ar x libc6_2.2.4-7.dodes.0_sh3.deb
$ tar xfzv data.tar.gz
# cp -a lib /usr/sh3-linux/
$ cd ..
$ rm libc6-sh3
続いて libc6-dev-sh3 の展開&インストール
$ mkdir libc6-dev-sh3
$ cd libc6-dev-sh3
$ ar x libc6-dev_2.2.4-7.dodes.0_sh3.deb
$ tar xzfv data.tar.gz
$ cd usr
# cp -a lib /usr/sh3-linux/
# cp -a include /usr/sh3-linux/
$ cd ..
$ rm libc6-dev-sh3

/usr/sh3-linux/bin
クロスコンパイルツールがインストールされる
/usr/sh3-linux/lib
クロスのライブラリ
/usr/sh3-linux/include
クロスライブラリのヘッダー

となればOKです。

【手順2】gcc-3.0.3 ソースを /usr/src/toolchain にダウンロードし、bzip2形式にする。

sh3-linux-gcc のソースは GNUオリジナルのソース+パッチです。
toolchain-source-3.0.3 を apt-get すればよいのですが、もう既に入手できなくなっているので
GNUのFTPからソースをダウンロードします。

必要なもの

ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.0.3/
CDROM /cross-tool/source
gcc-3.0.3.tar.gz

インストール先のディレクトリを作る
# mkdir /usr/src/toolchain
# cd /usr/src/toolchain
.gz 形式を .bz2 形式に直す
# gzip -d gcc-3.0.3.tar.gz
# bzip2 -9 gcc-3.0.3.tar
シンボリックリンクを張る
# ln -s gcc-3.0.3.tar.bz2 gcc.tar.bz2
# ls -l
gcc-3.0.3.tar.bz2
gcc.tar.bz2 -> gcc-3.0.3.tar.bz2

【手順3】 gcc-3.0.3 のコンパイル

必要なもの

ftp://ftp.m17n.org/pub/dodes/debian/crosstools/
CDROM /cross-tool/source
gcc-sh-linux_3.0.3-dodes.2.tar.gz
gcc-sh-linux_3.0.3-dodes.2.dsc

Debianホストの場合

Debianホストの場合は dpkg-source や dpkg-buildpackage コマンドを使って自動的にビルドすることができます。

適当な作業ディレクトリで
$ cd /tmp
$ dpkg-source -x gcc-sh-linux_3.0.3-dodes.2.dsc  <-- ソースの展開
$ cd gcc-sh-linux-3.0.3

debian/rules ファイルを編集

# Specify which packages we should build. See debian/NOTES.
ifndef allarch
# allarch = sh3 sh4 sh3eb sh4eb
allarch = sh3
endif
export allarch

debian/control ファイルを編集

Source: gcc-sh-linux
Section: devel
Priority: extra
Maintainer: YAEGASHI Takeshi <t@keshi.org>
Standards-Version: 3.0.2
Build-Depends: m4, autoconf (>= 2.13), libtool, gawk, dejagnu (>= 1.4), bzip2, 
binutils-sh-linux, gperf (>= 2.7-3), bison, flex, gettext, texinfo, zlib1g-dev, 
debhelper (>= 2.0.50), toolchain-source (=3.0.3-1)

下線部分 binutils-sh-linux と toolchain-source を削除する

コンパイルの実行
$ dpkg-buildpackage -B -ash3 -uc -us -rfakeroot

だいたいこの程度の時間が必要です。(Celeron 466x2機)
real    12m10.492s
user    16m53.510s
sys     2m31.220s

確認&インストールします。

$ cd ..
$ ls *.deb
gcc-sh3-linux_3.0.3-dodes.2_i386.deb
gcclibs-sh3-cross_3.0.3-dodes.2_all.deb
# dpkg -i gcc-sh3-linux_3.0.3-dodes.2_i386.deb
# dpkg -i gcclibs-sh3-cross_3.0.3-dodes.2_all.deb

非Debianホストの場合

パッチファイル(gcc-dodes.diff)を取り出します。

$ tar xzfv gcc-sh-linux_3.0.3-dodes.2.tar.gz
$ cp gcc-sh-linux-3.0/debian/patches/gcc-dodes.diff .

ソースを展開した後、上で取り出したパッチ(gcc-dodes.diff)を当てます。

$ cd /tmp
$ mkdir gcc-3.0.3
$ cd gcc-3.0.3
$ tar --bzip2 -xf /usr/src/toolchain/gcc.tar.bz2
$ cd gcc-3.0.3
$ patch -p1 < gcc-dodes.diff

コンフィギュア

$ mkdir build
$ cd build
$ ../configure --target=sh3-linux --prefix=/usr \
--enable-languages=c++ \
--with-gnu-as --with-gnu-ld --with-system-zlib \
--disable-nls --without-included-gettext \
--disable-checking --disable-cpp --enable-c99 \
--enable-long-long --enable-shared --enable-threads=posix \
--with-gxx-include-dir=\${prefix}/sh3-linux/include/g++-v3

またパッチ作業

$ sed -e 's%^CROSS_SYSTEM_HEADER_DIR.*$%CROSS_SYSTEM_HEADER_DIR = $(tooldir)/include%' < gcc/Makefile > gcc/Makefile.tmp
$ mv gcc/Makefile.tmp gcc/Makefile

make & インストール

$ make all-gcc
# make install-gcc

$ make all-target-libstdc++-v3
# install-target-libstdc++-v3

以上で sh3-linux-gcc も sh3-linux-as も SH3用のCライブラリもインストールできたので
クロスでCコンパイラが使えるようになりました。

$ cat hello.c
int main(){
        printf("hello world\n");
}

$ sh3-linux-gcc hello.c
$ file a.out
a.out: ELF 32-bit LSB executable, Hitachi SH, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
Last-modified: 2006-01-19 (木) 16:38:20 (6671d)