README.TXT 3.92 KB
             標準関数ライブラリ V1.31 (libnustd.a)について

標準関数ライブラリ libnustd.a は ANSI準拠関数ライブラリです。

N64OSには、ANSI準拠ライブラリの関数は一部分しか含まれていないため、
それを補うために、このライブラリは作成されました。

コンソール入出力などを除くANSI準拠のほとんどの関数がソース付きで提供されて
おり、ユーザーがカスタマイズすることも出来ます。

数値演算関数にはdouble版とfloat版があります。
メモリ割当てルーチンにはアラインメント調整つきのものも用意し、メモリ割当ての
整合性をチェックするルーチンもあります。

関数の詳細についてはマニュアル大全集のNuSYSTEMの下の標準関数リファ
レンスまたは各関数ソースのコメントをご覧ください。


○SGIコンパイラでの使用方法

標準関数ライブラリを使用するためには、Makefile に、以下のようにインクルード
パスとライブラリパスを指定する必要があります。

  N64KITDIR    = /usr/local/n64kit
  NUSTDINCDIR  = $(N64KITDIR)/nustd/include
  NUSTDLIBDIR  = $(N64KITDIR)/nustd/lib
 
    (略)

  LCINCS =     -I$(NUSTDINCDIR)
  LDFLAGS =    $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib -L$(NUSTDLIBDIR) \
		-u sprintf -lultra_d -lnustd_d
 
ROMバージョンを作る際は LDFLAGS を以下のようにします。

  LDFLAGS =    $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib L$(NUSTDLIBDIR) \
		-lultra_rom -lnustd

malloc_memcheck(), mt_malloc_memcheck(), malloc_memdsp(),
mt_malloc_memdsp() では、sprintf を使用しているため、これらの関数を使
用する場合には -u sprintf の記述をしなければならないことに注意してくだ
さい。


○exeGCC(N64)での使用方法

exeGCC には ANSI準拠のライブラリが付属しているため libnustd.a を使う
必要性は少ないかもしれません。
関数名・インクルードファイル名ともexeGCCと同じ名前を使用しているので、
このライブラリを使用する場合、以下のようにオプションを付ける必要があります。

  N64KITDIR    = c:\nintendo\n64kit
  NUSTDINCDIR  = $(N64KITDIR)/nustd/include
  NUSTDLIBDIR  = $(N64KITDIR)/nustd/lib

  .c.o:
	$(CC) -g -G 0 -c -nostdinc -I- -I$(NUSTDINCDIR) -I$(INC)/PR \
	-I$(INC)  -D_MIPS_SZLONG=32 -D_MIPS_SZINT=32 $<

  (略)

  LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \
		-lgultra_d -lnustd_d -lkmc

exeGCCのANSIC準拠ライブラリのインクルードファイルを見に行かなくするように
.c.o に -nostdinc -I- というオプションを追加しています。

ROMバージョンを作る時は LDFLAGS を以下のようにして下さい。

  LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \
		-lgultra_rom -lnustd -lkmc


○標準関数ライブラリの再構築について

nustd/src ディレクトリ下でmakeをかけることによりライブラリが再構築できます。
make のみで ROM バージョン(libnustd.a)、 make deb でデバッグバージョン
(libnustd_d.a)のライブラリが出来ます。
(make をかける前には .o と.a を全て消しておくのが無難です。)

Ver1.3 現在での ROM バージョンとデバッグバージョンの違いは、デバッグ情
報が含まれているかいないかと、オプティマイズレベルの違いです。


○ライブラリの検索順について

リンカーは -l オプションで宣言された順に関数の検索を行います。
同じ関数が各ライブラリに含まれている場合、ライブラリの順によりリンクされる
オブジェクトが異なるため注意が必要です。

Ver1.1 以前では、N64OS に含まれている関数と重複している関数が存在して
いましたが、Ver1.3 現在では重複しないように、それらの関数の名前が変更
されています。変更された関数と、変更後の名前の対応は以下の通りです。

  sqrtf()  --> _nsqrtf()
  strchr() --> _nstrchr()
  strlen() --> _nstrlen()
  memcpy() --> _nmemcpy()
  ldiv()   --> _nldiv()
  sinf()   --> _nsinf()
  cosf()   --> _ncosf()


○標準関数ライブラリの注意事項

・errno は使用できません。
・sin(),cos() などに引数の型の最大に近い値を入れた時の動作の保証はあり
  ません。浮動小数の精度の問題もありますし、角度が大きな値にならないよ
  うにプログラムして下さい。
・malloc() は複数スレッドからの同時アクセスが発生した場合の対策が行わ
  れていません。複数スレッドに対応した malloc() として mt_malloc() が
  用意されています。
・malloc() は16バイトアラインです。
・memalign()で確保したエリアは、realloc するとアラインメントの保証は無
  くなります。
・setjmp() では、FPUのレジスタの保存は行っていません。