[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

cross compiling problems



竹村です。

wscons をすこしいじっていましたが、実はその前の
user land 全滅の件はまだ解決していません。
今日もちょっと見ていたのですが、いずれもクロスコンパイル時
の問題のようなので、すこしまとめて
みなさんのアドバイスを頂きたいと思います。

1. SOFTFLOAT の問題
クロスコンパイル時には -Dhpcmips がつきません。このため、
gnu/dist/gcc/config/mips/netbsd.h で NOUSE_GOFAST と
SOFTFLOAT が定義されません。

MACHINE=hpcmips が設定されないのか、 それとも違う値なのか、
gnu/lib/libgcc/Makefile,. gnu/lib/libobjc/Makefile:,
gnu/usr.bin/egcs/Makefile.inc の
.if (${MACHINE} == "hpcmips") は有効にならないようです。

netbsd.h の頭に #define hpcmips を追加してコンパイルしました。

2. extern inline の問題
lib/libc/arch/mips/fplib/hpcmips-gcc.h と 同 environment.h に
#define INLINE extern inline とありますが、これがあると

INLINE bits32 extractFloat32Frac( float32 a )
{
...
}

のように softfloat.c 内で定義されている関数がリンク時に
すべて undefined になってエラーになってしまいました。
#define INLINE inline に直したらリンクできました。

そもそも、extern inline とはどういう意味なのでしょうか!?

3. argument の問題
1.と2.を誤魔化してなんとか user land を作り直したのですが、
init をはじめ、ほとんどすべてのコマンドは実行すると
segmentation fault を起こしてしまいます。
調べてみると、main(ac, av) の ac, av の値がでたらめでした。
crt0.c の __start が実行される時点で、kernel が用意した
スタック上の ac, av が一部壊れているような気がします。
コマンドラインの引数をチェックするプログラムはほとんど
すべて core dump します。

篠原さんの作ってくれた snapshot の /usr/lib/crt0.o を
使えば OK なので、crt0.o のコンパイルがうまくいって
いないようなのです。crt0.c 内の #ifdef DYNAMIC と
書いてあるあたりになにかコンパイラ依存の stack pointer
の操作が書かれているのですが、このへんがくさいです。

Takemura