Last Update: "2008/07/15 11:18:05 makoto"
. . .
2008/07/14 の日記
cross compiler
Windows
Windows の上で使えるオープンソースのコンパイラには
mingw と
cygwin の gcc
があります。このうち、mingw を使うと、
「何も他に必要としないで、cygwin の入っていない機械でも、
そのまま実行出来る」
ような実行形式が出来ます。
これはとても便利です。
ここでは、その mingw を使って NetBSD 上にクロスコンパイラを作って見ます。
クロスコンパイラを用意する一般的な方法は次の三つを準備することです。
- lib/include
- binutils
- gcc
1. の lib/include は、
「標的とする環境でもし(セルフ)コンパイルをすると仮定して、
その時に使うライブラリとへッダファイル」
と全く同じものを使います。
次の 2.
binutils はアセンブラ・リンカ(as/ld)
などを始めとする gcc の下請けとも言えるプログラムです。
その他に objdump など便利な道具も入っています。
これを標的とする環境用に構成します。
最後の 3.
gcc も同じようにして標的とする環境用に構成します。
前提として 配布形式 (distfiles) を $DISTFILES に用意してあり、また
$LOCALSRC のディレクトリで作業するとします。
今回使う配布形式は次のようなものです。
> (cd $DISTFILES;ls -l binutils-2.15.tar.* gcc-3.4.3* mingw-run*5.t* w32api-3.1.*)
-rw-r--r-- 1 makoto wheel 11515075 May 18 2004 binutils-2.15.tar.bz2
-rw-r--r-- 1 makoto wheel 27425338 Nov 5 18:00 gcc-3.4.3.tar.bz2
-rw-r--r-- 1 makoto wheel 443702 Dec 25 16:12 mingw-runtime-3.5.tar.gz
-rw-r--r-- 1 makoto wheel 1523310 Dec 25 16:50 w32api-3.1.tar.gz
1. lib/include
これはコンパイル済のものが
用意してあるので、
設置先で開けるだけです。ここでは設置先を /usr/local/i386-mingw32
とします。もしコンパイル済のものがない時には、これも用意する必要が
ありますが、今回は(やったことがないので)その説明は省きます
mingw-runtime と w32api は
http://www.mingw.org/download.shtml
の画面の下の方に一覧があるので、そこから取得します。
> sudo mkdir /usr/local/i386-mingw32
> cd /usr/local/i386-mingw32
> sudo tar zxf $DISTFILES/mingw-runtime-3.5.tar.gz
> sudo tar zxf $DISTFILES/w32api-3.1.tar.gz
2. binutils
--target=i386-mingw32 を指定して configure します。
> cd $LOCALSRC
> tar zxf $DISTFILES/binutils-2.15.tar.bz2
> mkdir binutils-work
> cd binutils-work
> ../binutils-2.15/configure --target=i386-mingw32
> make
> sudo make install
3. gcc
これも同じく
--target=i386-mingw32 を指定して configure します。
gcc を make する時には gmake を使った方が簡単です。
また、簡単のため C と C++ だけを作ることにします。
> tar zxf $DISTFILES/gcc-3.4.3.tar.bz2
> mkdir gcc-work
> cd gcc-work
> ../gcc-3.4.3/configure --target=i386-mingw32 --enable-languages=c,c++
> gmake
> sudo make install
これで、gcc は、bin/i386-mingw32-gcc という名前で設置されます。
動作確認
まずは Hello World! をコンパイルします。hello.c の中身は次の通りです。
> cat hello.c
#include "stdio.h"
main (){
printf( "hello world!\n");
}
このような内容を用意しておいて、
いま作ったばかりの i386-mingw32-gcc を使い、
次のようにすれば、Windows/2000 等用の実行形式が出来ます。
> rehash
> i386-mingw32-gcc -o hello-win2k.exe hello.c
> file hello-win2k.exe
hello-win2k: MS Windows PE 32-bit Intel 80386 console executable not relocatable
これを何らかの方法で Window の機械に転送します。
ftp を使うならおそらく bin の指定が必要になります。
そして、それを DOS 窓で実行します。
binutils
hello.c は簡単すぎるので、もう少し大きなものはどうなるかと
いうことで、
例えば、windows で動く、powerpc (NetBSD)用のアセンブラを作ってみます。
一例ですが、configure の時に指定する引数は次のようにします。
指定内容 | 引数 | 引数に与える値 |
make する機械 | --build | i386--netbsd |
作ったアセンブラを動かす機械 | --host | i386-mingw32 |
そのアセンブラが作り出すコードを動かす機械 | --target | powerpc--netbsd |
> env CC=i386-mingw32-gcc \
../binutils-2.15/configure \
--target=powerpc--netbsd \
--host=i386-mingw32 \
--build=i386--netbsd
> env CC=i386-mingw32-gcc make
これでクロスアセンブラが、
gas/as-new という名前で出来ます。
objdump
pkgsrc
pkgsrc/cross の下に
i386-mingw32
があります。
これがここで説明しているものと同じ機能のはずです。
2006/09 に見たところ次のような組合せを使っています。
Version Makefile,v 1.27 2006/06/09 15:50:03 minskim
binutils 2.15.90-20040222-1-src.tar.gz (2.15)
gcc 3.3.3 (3.4.3)
gcc-3.3.3-20040217-1-src.diff
mingw-runtime mingw-runtime-3.2.tar.gz (3.5)
w32api w32api-2.5.tar.gz (3.1)
ここで紹介している版(かっこ内に示したもの)よりやや古いのが気になります。
現在、4 点 必要なもののうち次の 3 点は
mingw-w32api
mingw-rutime-bin
mingw-binutils
wip
(
http://sourceforge.net/projects/pkgsrc-wip/
)
にも用意してあります。
また、ちょっと変則的ですが、
http://cvsweb.ki.nu/mef/personal-pkgsrc/i386-mingw32/
を sudo make package すれば、環境は用意出来るかと思います。
その他
ここでは binutils と gcc を作る時に、--prefix
の指定をしませんでした。この方法の場合、設置されるものは
/usr/local の下に散らばります。これが必要なくなった場合など、
入れたものを手で消そうとする時は、
ちょっと手間がかかります。それを避けたければ、
configure する時に、引数に、
例えば、
--prefix=/usr/local/i386-mingw32
を加えておけば、その下にまとめて入れてくれます。
しかし使い勝手は、多分、散らばってしまった方がいいはずです。
何かお気付の点がありましたら makoto at ki dot nu までお知らせ下さい。
|