PocketBSD for モバギII のための第一歩 クロスコンパイル環境の構築について。 前準備) OpenBSD-2.3 の pmax comp23.tar.gz と src.tar.gz および gcc-2.8.1 , binutils-2.9.1 を用意します。 gcc-2.8.1, binutils-2.9.1 は全部展開 comp23.tar.gz は、 ./usr/include だけ使用 src.tar.gz は、 lib/libc lib/csu bin/cat (テスト用) usr.bin/make usr.bin/cmp (テスト用) share/mk gnu/usr.bin/gcc/configure gnu/usr.bin/gcc/config.sub gnu/usr.bin/gcc/config が最低でも必要です。 ----------------------------------------------------------- I) binutils の make ld/configure.tgt を編集し、 mips*-*-openbsd*) targ_emul=elf32lmip ;; の1行を追加してから、 configure --target=mipsel-unknown-openbsd 最後に gmake とします。 ----------------------------------------------------------- II) binutils および include ファイルのインストール comp23.tar.gz の usr/include を /usr/local/mipsel-unknown-openbsd/include に展開し、bin と lib を mkdir しておきます。 次に、/usr/local/mipsel-unknown-openbsd/bin に ar,nm,size,as,c++filt,ld,ranlib,strip をインストール。 --- スクリプト例ここから #!/bin/sh INST=/usr/local/mipsel-unknown-openbsd/bin INSTALL=cp $INSTALL gas/as-new $INST/as $INSTALL ld/ld-new $INST/ld $INSTALL binutils/ar $INST $INSTALL binutils/ranlib $INST $INSTALL binutils/nm-new $INST/nm $INSTALL binutils/size $INST $INSTALL binutils/strip-new $INST/strip $INSTALL binutils/objdump $INST $INSTALL binutils/c++filt $INST --- ここまで さらに、FreeBSD の lorder を コピーしたあと、 loarder を編集します。 PATH=/usr/local/mipsel-unknown-openbsd/bin:/bin:/usr/bin -------------------------------------- の追加 あと、binutils の NM のフォーマットが違うので、次のように編集します。 --- ここから ${NM:-nm} -g $* | awk ' /:$/ { fname=$0 print $0; } /^$/{ fname="" } /[A-Za-z90-9_\$]$/ { printf("%s%s\n",fname,$0); }' | sed " /:$/ { --- ここまで ----------------------------------------------------------- III) gcc のコンパイル src.tar.gz の gnu/usr.bin/gcc から、次のファイルを gcc-2.8.1 にコピーします。 configure config.sub config/openbsd.h config/x-openbsd config/mips/* configure --target=mipsel-unknown-openbsd --with-gnu-as --with-gnu-ld \ --with-gxx-include-dir=/usr/local/mipsel-unknown-openbsd/include/g++ ここで Makefile を編集しておきます。 # sed inserts variable overrides after the following line. ####target overrides の部分を、 CFLAGS = -O OLDCC = $(GCC_FOR_TARGET) LIBGCC1=libgcc1.a CROSS_LIBGCC1=libgcc1.cross と修正 libgcc1.cross: libgcc1.a --------- 追加 つぎに GCC_FOR_TARGET = ./xgcc -B./ -mcpu=vr4100 ------------ 追加 最後に gmake ----------------------------------------------------------- IV) gcc のインストール --- ここから DIST=/usr/local/mipsel-unknown-openbsd/bin GCCDIST=/usr/local/lib/gcc-lib/mipsel-unknown-openbsd/2.8.1 cp xgcc $DIST/gcc cp cpp $DIST/cpp cp cc1 $GCCDIST cp cc1plus $GCCDIST cp specs $GCCDIST cp libgcc.a $GCCDIST ln -sf $DIST/cpp $GCCDIST/cpp ln -sf $DIST/gcc /usr/local/bin/gcc-mips ---- ここまで つぎに、specs を修正しておきます。 *asm: のところに、%{fpic:-KPIC} を挿入 ---- ここから *asm: %{G*} %{fpic:-KPIC} ....... ---- ここまで ----------------------------------------------------------- V) make のインストール OpenBSD の make を作成します。 src.tar.gz の usr.bin/make で pathname.h を修正 #define _PATH_DEFSYSPATH "/usr/local/mipsel-unknown-openbsd/mk" var.c を修正 #include <<< 追加 #include make ( 注) bsd make を使います ) make をインストール --- ここから DIST=/usr/local/mipsel-unknown-openbsd/bin cp make $DIST ln -sf $DIST/make /usr/local/bin/omake ---- さらに、src.tar.gz の share/mk を /usr/local/mipsel-unknown-openbsd/mk に展開します。 bsd.own.mk を編集 --- ここから # Set `SKEY' to `yes' to build with support for S/key authentication. SKEY= no # Set `KERBEROS' to `yes' to build with support for Kerberos authentication. KERBEROS= no # Set `KERBEROS5' to `yes' to build with support for Kerberos5 authentication. KERBEROS5= no # Set `YP' to `yes' to build with support for NIS/YP. YP= yes MACHINE_ARCH=mips CC=/usr/local/mipsel-unknown-openbsd/bin/gcc -mcpu=vr4100 -fpic CPP=/usr/local/mipsel-unknown-openbsd/bin/cpp -I/usr/local/mipsel-unknown-openbsd/include LD=/usr/local/mipsel-unknown-openbsd/bin/ld AS=/usr/local/mipsel-unknown-openbsd/bin//as -mcpu=vr4100 AR=/usr/local/mipsel-unknown-openbsd/bin/ar RANLIB=/usr/local/mipsel-unknown-openbsd/bin/ranlib NM=/usr/local/mipsel-unknown-openbsd/bin/nm LORDER=/usr/local/mipsel-unknown-openbsd/bin/lorder STRIP=/usr/local/mipsel-unknown-openbsd/bin/strip # Set `TCP_WRAPPERS' to `yes' to build certain networking daemons with --- ここまで ----------------------------------------------------------- (!) これで クロス make 環境のインストールは終りました。 omake 一発で make できるはずです。 ためしに lib/libtermlib の make をやってみましょう。 エラーが出たら gcc のインストールは失敗です。 ------------------------------------------------------------ VI) libc,crt0 の インストール lib/libc で omake します。 # なぜか errno.o がアーカイブされません. # 次のようにして,アーカイブしておきます. # /usr/local/mipsel-unknown-openbsd/bin/ar ruc libc.a errno.o # omake ( もういちど ) cp libc.a libc.so.18.0 /usr/local/mipsel-unknown-openbsd/lib lib/csu で omake します。 cp mips/*.o /usr/local/mipsel-unknown-openbsd/lib ---------------------------------------------------------- (!) さてこれで、ちょっとしたコマンドが make できるようになったはずです。 ためしに bin/cat usr.bin/cmp を make してみましょう。 エラーが出たら、gcc のインストールが失敗しているかもしれません。 ------ 注意事項) a) -mcpu=vr4100 は、-msoft-float を含んでいます。 gcc のデフォルトにしようと思っていますが、まだやっていません。 b) bsd.own.mk に直接書くのは、美しくないかもしれません。 include しているファイルを書いた方がよいかも。 c) 私は, gcc-mips, omake 以外に 次のようなリンクを作っています. CURDIR=/usr/local/mipsel-unknown-openbsd ln -sf $CURDIR/bin/ld /usr/local/bin/ld-mips ln -sf $CURDIR/bin/as /usr/local/bin/as-mips ln -sf $CURDIR/bin/nm /usr/local/bin/nm-mips ln -sf $CURDIR/bin/ar /usr/local/bin/ar-mips ln -sf $CURDIR/bin/strip /usr/local/bin/strip-mips ln -sf $CURDIR/bin/ranlib /usr/local/bin/ranlib-mips ln -sf $CURDIR/bin/size /usr/local/bin/size-mips ln -sf $CURDIR/bin/objdump /usr/local/bin/objdump-mips d) lorder をちゃんと修正しないと、アーカイブがちゃんと作れません。 e) /usr/share/misc/magic の修正。 file で出て来る "MathCoPro/FPU/MAU Required" は 間違っています。 つぎのように修正すると、PIC かどうかが判って便利。 >>36 byte 2 PIC(reorder) >>36 byte 3 PIC(noreorder) >>39 byte 0x10 mips2 >>39 byte 0x20 mips3 >>39 byte 0x30 mips4 #>>36 lelong 1 MathCoPro/FPU/MAU Required --------------------------------------------------------- ChangeLog: v2: CC の定義を変更 (-fpic 追加) lorder の修正を追加 magic の修正を追加 -----