[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[pbsd-mg2] Re: cross compile env.
鈴木(康)です。
<199901120147.KAA12559@shin1.sm.sony.co.jp>の記事において
takemura@sm.sony.co.jpさんは書きました。
|
| たけむらです。
|
| MIPS BSD 用のバイナリの作成環境の件です。
|
| 私は、坂本さんがこの ML に流した cross compile 用のパッケージを
| 使って作りました。
|
| このメール↓
| > Message-Id: <199812080708.QAA02050@dione.cec.co.jp>
| > Date: Tue, 8 Dec 1998 16:08:06 +0900 (JST)
| > Subject: [pbsd-mg2] Re: pmax? arcs?
| > From: sakamoto@cec.co.jp (Kazuki Sakamoto)
|
| しかし、このパッケージには説明がほとんどないので、以前鈴木さんに
| もらったクロス環境構築のメモがとても参考になりました。
| もういちど、ここにあのメモを流してもらえませんか>鈴木さん
では、参考までに、私のドキュメントを送ります。
すこしでもみなさんの役に立つと良いのですが....
特にカーネルmake 編は、あんまり適当でいまとなっては恥ずかしいのですが、
そのまま出しますね。
---- ここから
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 <sys/types.h> <<< 追加
#include <ctype.h>
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 の修正を追加
-----
カーネル make 編
mips 関係 の カーネルが make できるかどうかやってみます。
pmax の make にトライします。
前準備)
src.tar.gz の usr.sbin/config を展開し、
config を作成します。
make
cp config /usr/local/mipsel-unknown-openbsd/bin
ln -s /usr/local/mipsel-unknown-openbsd/bin/config /usr/local/bin/oconfig
-----
srcsys.tar.gz を展開します。
0) arch の削除
必要ない アーキティクチャ依存のファイルを消しておきましょう。
rm -rf alpha amiga arm32 atari hp300 kbus m68k mac68k mvme68k mvme88k \
pc532 powerpc sparc sun3 vax wgrisc
これで、53584 ブロック (25MB) ほど節約できます。
I) lib/libkern/Makefile の修正
lorder を ${LORDER} に変更します。
II) コンフィグ
cd arch/pmax/conf
oconfig PLUTO
III) arch/compile/PLUTO/Makefile の修正
.include <bsd.own.mk> <<<< 挿入
AS?= as
次を変更
CMACHFLAGS= # -mno-abicalls -mcpu=r3000
CMACHFLAGS= -D__GP_SUPPORT__ -fpic
つぎも修正
bsd: ${SYSTEM_DEP} swapbsd.o newvers
${SYSTEM_LD_HEAD}
${SYSTEM_LD} swapbsd.o
# ${SYSTEM_LD_TAIL} << 削除
IV) make
これで omake で make できるようになったはずです。
エラーがいっぱい出ますが、make のテストだけということで
無視します。
-------
移植のステップ
どのようにカーネルを移植していくかの計画案を書いておきます。
a) どれをベースにするか。
いちおう pmax をベースにするのがいいと思います。
ただし、デバイスドライバはすべて書きなおし。
どちらかというと、i386 系のドライバが近いので、i386 のドライバを
移植していった方がいいでしょう。
b) 移植手順
最初にブートを作らないとテストをする方法もないのですが、
それはおいておいて、カーネルについてだけ書きます。
ステップ1) コンソールメッセージの出力
pmax から、デバイスドライバを取り除き、
ディスクとコンソールドライバだけのカーネル
をつくります。
ディスクドライバを動かすには、pao レベルまで入れないといけないので、
FreeBSD の ramdisk を移植し、diskimage をカーネル内に含むように
したほうがいいと思います。
そうすると、最初のステップで必要となるデバイスは、console だけになります。
まずは、console の出力だけが必要です。
syscons のような大規模なドライバを使う前に、
簡単な console ドライバを作成した方が早いかも知れません。
ステップII) ddb(kdb) の動作確認
メモリの初期化ができ、コンソールメッセージが出力できるようになれば、
デバッグが少しできる状態になります。
コンソールのキーボードを使えるようにするためには、
割り込み系がちゃんと動かなくては
なりません。割り込みドライバが最初の障害になると思います。
ここで、ddb(kdb) の動作を確認しましょう。
ステップIII) カーネル立ち上げ
デバッグを進めていって、/sbin/init が動くところまで来たら、
ようやく、移植の準備が整ったことになります。
ここでは、/sbin/init の フォーマットが問題になると思います。
うまくいかないときは、pmax のバイナリを使ってみましょう。
( でもそれでうまくいったら、gcc の移植が失敗していることになります。)
ステップIV) コマンドの実行
/bin/sh が実行できるまでには、いろいろ難関があります。
FP レジスタがないことが、最大の障害になるでしょう。
setjmp などの アセンブラのソースを確認する必要があります。
ステップV) ドライバ移植
必要なドライバを移植していきます。
ここでも、ドライバのベースの選択が大事です。
PAO がある、FreeBSD のドライバを移植した方が良いでしょう。
--
鈴木 康司 @NEC
suz@hpc.bs1.fc.nec.co.jp
TEL 0423-33-5381