[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