freebsdクロスコンパイル


cygwin->freebsdのクロスコンパイル

ここではaaacafeでC言語、D言語のCGIを動かすクロスコンパイラの作り方を紹介します。 ここ読んで難しいと思う人は、freebsdクロスコンパイラバイナリを参照してみてください。

Cygwinのインストール

あたりを参考にインストールしてください。

私は、ftp://ftp.u-aizu.ac.jp/pub/gnu/gnu-win32/ からsetup.exeをダウンロードしてきて次へ次へとボタンを押していってインストールしています。

注意すべき点はSelect Packagesで以下のツールをデフォルトに加えてチェックすることです。

bisonクロスコンパイラのコンパイルに必要
flexbinutilsのコンパイルに必要
makeコンパイル時に必要
perldmdのスクリプトの実行に必要
patchgccにパッチをあてるのに必要
gccgcc-3.3.1-3 クロスコンパイラのコンパイルに必要
gcc-g++gcc-g++3.3.1-3 std.reclsのクロスコンパイラではないほうの通常のコンパイルに必要となったりします。なくてもいいけど、とりあえず入れておいてください。
vimコマンドラインからエディットしたいときに必要

この作業を忘れても後からsetup.exeを使用して追加できます。

ダウンロード

以下のソースファイルをインターネット上からダウンロードしてきます。

ファイル説明URL
GNU binutils-2.10.1.tar.gzfreebsd用のリンカとかその他もろもろをコンパイルするために必要なツール群です。http://ftp.gnu.org/gnu/binutils/
GNU gcc-3.3.2.tar.bz2(現在gcc-3.4.0.tar.bz2は、c++が通らない) freebsd用のgcc,g++,gdcを作るためのものです。http://ftp.gnu.org/gnu/gcc/
d-for-gcc-r1f.tgzdのgccフロントエンドです。http://home.earthlink.net/~dvdfrdmn/d/
  • 拾ってきたファイルは/usr/src/以下においておきます。

binutilsのインストール

cd /usr/src/
tar zxf binutils-2.10.1.tar.gz

これで、/usr/src/binutils-2.10.1/ディレクトリができる。

cd /usr/src/binutils-2.10.1/
./configure --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin
make
  • prefix インストールするディレクトリです。
  • target クロスコンパイルする先の名前です。
  • host クロスコンパイルするマシンの環境の名前です。
Error on line 1061: '+' is not a valid filename char

と出た場合はDOSコマンドのほうのc:\dm\bin\makeが使われている可能性があります。 DOSのコマンドが混ざるとわけがわからなくなるのでパスをはずします。

  • etc/profileの以下の部分を直します。
#PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH"
PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin"
make install
ls /usr/local/freebsd/bin

で以下のファイルができていればbinutilsのインストールは成功です。

i386-freebsd4-addr2line.exe  i386-freebsd4-objcopy.exe
i386-freebsd4-ar.exe         i386-freebsd4-objdump.exe
i386-freebsd4-as.exe         i386-freebsd4-ranlib.exe
i386-freebsd4-c++filt.exe    i386-freebsd4-readelf.exe
i386-freebsd4-gasp.exe       i386-freebsd4-size.exe
i386-freebsd4-ld.exe         i386-freebsd4-strings.exe
i386-freebsd4-nm.exe         i386-freebsd4-strip.exe
export PATH=/usr/local/freebsd/bin:$PATH

などとしてパスを通します。.bash_profileあたりに書いておきましょう。

gdcのインストール

  • 解凍
cd /usr/src/
tar jxf gcc-3.3.2.tar.bz2

これで/usr/src/gcc-3.3.2/ディレクトリができます。

tar zxf d-for-gcc-r1f.tgz

これで/usr/src/d/ディレクトリができます。

mv d gcc-3.3.2/gcc/.

として移動します。

  • gcc のパッチ当てを行います。

dディレクトリ内にバージョンにあったGCCパッチがあります。名前はpatch-gcc-....といった感じです。今回はpatch-gcc-3.3.2を使います。

cd /usr/src/gcc-3.3.2/gcc/
patch -p1 < d/patch-gcc-3.3.2

としてパッチをあてます。

  • freebsdのincludeファイルとlibファイルのダウンロード
    • aaacafeの/usr/include 以下をダウンロードしてきて、 /usr/local/freebsd/i386-freebsd4/include以下にコピーします。
    • aaacafeの/usr/lib 以下をダウンロードしてきて、/usr/local/freebsd/i386-freebsd4/lib以下にコピーします。

ダウンロード方法は、cgiスクリプトを書いて、自分の見えるフォルダにコピーしてftpでダウンロードすればOKです。何十メガと大きいので心配かもしれませんが、200Mまでaaacafeで領域を使えるので大丈夫です。この作業は各自の責任で十分注意しながら行ってください。

includeとlibは全部必要なわけでもないと思いますが、どれが必要でどれが必要でないか調べることができないので(ファイルが多すぎてめんどくさい)全部ダウンロードしています。


クロスコンパイラのコンパイル

cd /usr/src/gcc-3.3.2/
./configure --enable-languages=c,d,c++ --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin
make
make install
  • prefix インストールするディレクトリです。
  • target クロスコンパイルする先の名前です。
  • host クロスコンパイルするマシンの環境の名前です。

includeファイルをコピー

cp -r /usr/src/gcc-3.3.2/gcc/d/phobos /usr/local/freebsd/include/d

とりあえず、これでコンパイルができる環境になったはずです。object.dが見つからないエラーの対策です。

//main.d
void main()
{
    printf("content-type: text/html\n\nhello world.\n");
}

というファイルを作って、

i386-freebsd-gdc -c main.d 

これで、main.oができればコンパイル環境はできました。

ただ足りないファイルがあるのでダウンロードしてください。

  • fileconfig.dfileconfigunix.dを/usr/local/freebsd/include/d/gcc/以下にコピーしてください。
  • filephobos-ver-syms/usr/local/freebsd/include/d/以下にコピーしてください。

ライブラリ(phobos)の整備

あとはphobosとのリンクできればOKです。ホントはphobosも作ればいいのでしょうが、freebsdで作ったものがあるのでそれをつかいます。(shinichiro_hさんからいただきました。感謝)

  • phobosはここからダウンロードしてください。filephobos.tgz
  • libphobos.a を/usr/local/freebsd/i386-freebsd4/lib/に入れます。
  • libphobosnm.a を/usr/local/freebsd/i386-freebsd4/lib/に入れます。
  • libphobos.specがないと言われるので
    cp /usr/src/gcc-3.3.2/gcc/d/phobos/libphobos.spec /usr/local/freebsd/i386-freebsd4/lib/.
  • libphobos.specの
    *lib: -lm  %(liborig)
    *lib: -lm -lc_r  %(liborig)
    に書き換えます。

コンパイル

これで、環境はすべて整いました。
i386-freebsd4-gdc main.d

これで、mainができていればOKです。warningがでますが気にしないでください。Dしか使わない場合、 libc.soを消してしまえばwarningを消すことができます。*1

mv main main.cgi

シンボルが含まれているようなので、サイズが妙に大きいので、

strip main.cgi

として完成です。

UPLOAD

aaacafeにupしてパーミッションを705に変えてブラウザで動作を確認しましょう。


dmdでコンパイルできるようにする。

cygwin上ではクロスコンパイルしかしない場合

cp /usr/local/freebsd/bin/i386-freebsd4-gdc.exe /usr/local/freebsd/bin/gdc.exe

とすれば、

dmd main.d

でコンパイルできるようになります。 また、

export PATH=/usr/local/freebsd/i386-freebsd4/bin:$PATH

としておけば、gccやg++などもi386-freebsd4-*と入力しなくてもクロスコンパイルできるようになります。

cygwin アンインストール

上記のサイトを参考にしてください。

phobosのクロスコンパイル(未完)

まだできてません。メモです。今はバイナリをそのまま使っています。

export PATH=/usr/local/freebsd/i386-freebsd4/bin:$PATH
cd /usr/src/gcc-3.3.2/gcc/d/phobos/
./prepcygwin.sh
DFLAGS="-O2 -g -frelease" ./configure --prefix=/usr/local/freebsd --target=i386-freebsd4 --host=i386-cygwin
make
make install

configureの段階で以下のエラーをはいて終了します。

configure: warning: host_alias=i386-cygwin: invalid host type
configure: warning: target_alias=i386-freebsd4: invalid host type
configure: error: can only configure for one host and one target at a time
configure: error: /bin/bash './configure' failed for boehm-gc

gcc-3.4.0のc++のクロスコンパイル(未完)

./configure --enable-languages=c++ --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin

c++はなぜか、makeの段階で以下のエラーをはいてとまってしまいます。

/usr/src/gcc-3.4.0/gcc/xgcc -shared-libgcc -B/usr/src/gcc-3.4.0/gcc/ -nostdinc++
 -L/usr/src/gcc-3.4.0/i386-freebsd4/libstdc++-v3/src -L/usr/src/gcc-3.4.0/i386-f
reebsd4/libstdc++-v3/src/.libs -B/usr/local/freebsd//i386-freebsd4/bin/ -B/usr/l
ocal/freebsd//i386-freebsd4/lib/ -isystem /usr/local/freebsd//i386-freebsd4/incl
ude -isystem /usr/local/freebsd//i386-freebsd4/sys-include -I/usr/src/gcc-3.4.0/
i386-freebsd4/libstdc++-v3/include/i386-freebsd4 -I/usr/src/gcc-3.4.0/i386-freeb
sd4/libstdc++-v3/include -I/usr/src/gcc-3.4.0/libstdc++-v3/libsupc++ -O2 -g -O2
-g -O2 -fno-implicit-templates -Wall -W -Wwrite-strings -Wcast-qual -fdiagnostic
s-show-location=once -ffunction-sections -fdata-sections -I/usr/src/gcc-3.4.0/i3
86-freebsd4/libstdc++-v3/include/backward -Wno-deprecated -c ../../.././libstdc+
+-v3/src/strstream.cc  -fPIC -DPIC -o .libs/strstream.o
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s: Assembler messages:
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8818: Error: ignoring jun
k `(%ecx)' after expression
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8832: Error: ignoring jun
k `(%ecx)' after expression
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8983: Error: ignoring jun
k `(%ecx)' after expression

参考リンク


コメント

コンパイルできたけど、動かない。

(2004-06-04 (金) 20:24:46)

FreeBSD用としてコンパイル...出来た、けど実行できない。AAAでも。自分には何が悪いのかワカラン...。他のFreeBSD鯖で実行してみたら、

%./test.cgi
/usr/libexec/ld-elf.so.1: ./test.cgi: Shared object has no run-time symbol table
と出た。

  • .cgiをテキストモードで送ってたりしませんか? -- sakurai? 2004-06-04 (金) 21:10:05
  • ヾ( ゚д゚)ノ゛サクラサクラ、、、イ -- ahiru? 2004-06-04 (金) 21:13:26
  • sakkura i extens imode. -- 2004-06-04 (金) 21:15:08
  • 解決できました。 -- ahiru? 2004-06-05 (土) 11:06:59

*MenuBar

人気の10件

  • counter: 10274
  • today: 1
  • yesterday: 0
  • online: 1


*1 libphobos.specを*lib -l -lc_r %(liborig) を*lib -l -lc_r とする(%(liborig)を消す)ことで解決できます。