Name Last Update
..
CVS Loading commit data...
include Loading commit data...
src Loading commit data...
GNUmakefile Loading commit data...
README.TXT Loading commit data...
RELNOTE.TXT Loading commit data...
             標準関数ライブラリ 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のレジスタの保存は行っていません。