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

Cygwin上でSH3クロスコンパイル環境を整える

完成形は次のようになります。

  • binutils-2.11.92
  • gcc-3.0.4

参考URL

その他の関連link

クロス用ライブラリのインストール

Cygwin上にSH3Linux用のCライブラリーとヘッダーファイルを展開します。

cygwin上の
/usr/sh3-linux/lib
/usr/sh3-linux/include

にそれぞれライブラリーとヘッダーファイルをインストールします。方法はいくつかあって、CAT709の/lib/* , /usr/lib/* をコピーしてくるでもかまいません。ただ、CAT709にはincludeファイルは置いていないので、えびはらは以下の手順を使いました。

をCygwinの/home/自分 ディレクトリにダウンロードします。
次に各パッケージを /tmp の下に仮に展開します。

ebihara@giga ~
$ dpkg-deb.exe -x libc6_2.2.5-14_sh3.deb /tmp/

ebihara@giga ~
$ dpkg-deb.exe -x libc6-dev_2.2.5-14_sh3.deb /tmp/
$ ls /tmp
etc  lib  sbin  usr

となっていますから、最初に書いたとおり、lib/* と usr/lib/* を /usr/sh3-linux/lib に、include/* を /usr/sh3-linux/include にそれぞれコピーします。

ebihara@giga ~
$ cp -a /tmp/usr/lib/* /usr/sh3-linux/lib/

ebihara@giga ~
$ cp -a /tmp/lib/* /usr/sh3-linux/lib/

ebihara@giga ~
$ cp -a /tmp/usr/include/* /usr/sh3-linux/include/

以上で準備は完了です。もしも他に必要なライブラリが出てきましたら、同じ手順で、SH3用のライブラリとヘッダーを /usr/sh3-linux/lib , include にコピーしてください。

ライブラリパスの修正

さらにテキストエディターで /usr/sh3-linux/lib/libc.so ファイルを編集します。libc.so は単なるテキストファイルです。

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
GROUP ( /usr/sh3-linux/lib/libc.so.6 /usr/sh3-linux/lib/libc_nonshared.a )

最後の GROUP() 行を上記のように修正します。

binutilsのコンパイル

実績があるという意味で binutils-2.11.92 を使います。

$ tar xzfv binutils-sh-linux_0.dodes.20011207.orig.tar.gz
$ cd binutils-sh-linux.orig/
$ tar xjfv src.tar.bz2

次にビルド用のサブディレクトリを作り、コンフィグレーションし、make します

$ mkdir sh3-linux-build
$ cd sh3-linux-build
$ ../src/configure --disable-nls --target=sh3-linux --prefix=/usr
$ make
$ make install

エラー無く終了したら sh3-linux-as というアセンブラのコマンドが使えるようになっているはずです。単に as を起動したらホスト(i686-pc-cygwin) の アセンブラが起動することを確かめてください。

ebihara@giga ~/binutils-sh-linux.orig/sh3-linux-build
$ sh3-linux-as -v
GNU assembler version 2.11.92 (sh3-linux) using BFD version 2.11.92 20011202

ebihara@giga ~/binutils-sh-linux.orig/sh3-linux-build
$ as -v
GNU assembler version 2.15.91 (i686-pc-cygwin) using BFD version 2.15.91 20040725

gccのコンパイル

gccのほうも、実績があるという意味で gcc-3.0.4 を使用します。基本的にはこちら

に書いておいたとおりのことを行います。

.src.rpm 形式なので rpmコマンド*1で展開すると、/usr/src/rpm/SOURCES に展開されます。

$ mkdir -p /usr/src/rpm/SOURCES
$ rpm -i gcc-3.0.4-3.src.rpm
gcc-3.0.4-libspec.patch
gcc-3.0.4-static-libgcc.patch
gcc-3.0.4.tar.bz2
gcc-sh-linux-3.0.4-20020215-1.patch

gcc-3.0.4.tar.bz2を展開し、順にパッチをあてていきます。

$ tar xjvf /usr/src/rpm/SOURCES/gcc-3.0.4.tar.bz2
$ cd gcc-3.0.4
$ patch -p1 < /usr/src/rpm/SOURCES/gcc-sh-linux-3.0.4-20020215-1.patch
$ patch -p1 < /usr/src/rpm/SOURCES/gcc-3.0.4-libspec.patch
$ patch -p1 < /usr/src/rpm/SOURCES/gcc-3.0.4-static-libgcc.patch

コンパイル

$ mkdir sh3-linux-build
$ cd sh3-linux-build
$ ../configure --prefix=/usr --target=sh3-linux --host=i686-pc-cygwin \
--build=i686-pc-cygwin --enable-languages=c,c++ --mandir=/usr/share/man \
--with-system-zlib --with-gxx-include-dir=/usr/sh3-linux/include/g++-v3 \
--includedir=/usr/sh3-linux/include --disable-checking --with-x=no \
--enable-threads=posix --enable-long-long \
--with-as=/usr/bin/sh3-linux-as \
--with-ld=/usr/bin/sh3-linux-ld
$ make all-gcc
$ make install

実験

ここまで出来たら hello.c のクロスコンパイルが可能なはずです。
次のように簡単なプログラムを用意してコンパイルしてみます。

#include <stdio.h>

int main()
{
        printf("hello\n");
}
$ sh3-linux-gcc hello.c
$ file a.out

a.out: ELF 32-bit LSB executable, Hitachi SH, version 1 (SYSV), for GNU/Linux 2.3.99, dynamically linked (uses shared libs), not stripped

このようにSH用の実行バイナリが出来上がっていればokです。

続いて C++ の実験も行います。

#include <iostream>
using namespace std;
int main()
{
  cout << "hello world, new g++\n";
}

を用意して

$ sh3-linux-g++ hello.cc
$ file a.out

a.out: ELF 32-bit LSB executable, Hitachi SH, version 1 (SYSV), for GNU/Linux 2.3.99, dynamically linked (uses shared libs), not stripped

同じようにSH用の実行バイナリが出来上がっていればokです。

勘の言い方ならお気づきと思いますが、libcライブラリはdebianパッケージを利用して手で /usr/sh3-linux/lib にインストールしましたが、C++のライブラリ libstdc++-v3 はインストールして無いですよね。あれ?と思いませんか。libstdc++-v3 は gccツールチェインに含まれていて、先ほど gcc を install した際に /usr/sh3-linux/lib にインストールされました。

関連リンク

コメント

Last-modified: 2019-07-22 (月) 17:56:00 (1733d)