SSS-PC のアプリケーション開発について (2005.10.25 修正)

1. libc について

SSS-PC には、そのの前身 SSS-CORE から継承された libc と FreeBSD 4.x から移植された libc が在ります. 前者を「ネィテイブ libc」、後者を「UNIX 互換 libc」と呼びます.

SSS-PC 専用でファイルシステムに依存しないアプリーケーションには「ネィテイブ libc」、 UNIX 上で動作するアプリケーションを移植する場合は「UNIX 互換 libc」を用います.

2. ネィテイブ libc

ネイティブ libc は、クロス開発環境ディレクトリ(/usr/local/sss) 下に libc_sss.a と して提供されています.

 i386-unknown-ssscore3.elf/lib/libc_sss.a

また、カーネルやアプリケーション(/usr/sss/ssspc/elf/*)に用いられている汎用オブジェ クトが libsss.a, libproc_sss.a として提供されています.

 i386-unknown-ssscore3.elf/lib/libsss.a
 i386-unknown-ssscore3.elf/lib/libproc_sss.a

リンクスクリプトとスタートファイル(crt0.o)も同様にロス開発環境ディレクトリ下に用意 されています.

 i386-unknown-ssscore3.elf/lib/ldscript/elf_i386_ssspc.x
 i386-unknown-ssscore3.elf/lib/crt0.o

これらを使ってアプリケーションを開発する場合、例えば foo.c をコンパイルするのであれば、

 /usr/bin/gcc \
	-nostdinc -I/usr/local/sss/i386-unknown-ssscore3.elf/include \
	-o foo.o -c foo.c
 /usr/bin/ld -Bstatic \
	-T/usr/local/sss/i386-unknown-ssscore3.elf/lib/ldscript/elf_i386_ssspc.x \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crt0.o foo.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/libc_sss.a -o foo 

/usr/bin/gcc, /usr/bin/ld に換えて /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc, /usr/local/sss/i386-unknown-ssscore3.elf/ld を使うのであれば

 /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc -o foo.o -c foo.c
 /usr/local/sss/i386-unknown-ssscore3.elf/bin/ld -Bstatic \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crt0.o foo.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/libc_sss.a -o foo 

更にリンク(ld ではなく)に gcc を用いるのであれば

 /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc -static -sss -o foo foo.c

3. UNIX 互換 libc

UNIX 互換 libc は、クロス開発環境ディレクトリ(/usr/local/sss) 下に libc.a として 提供されています.

ネイティブ libc と同様に /usr/bin/gcc, /usr/bin/ld を用いてコンパイルするのであれば、

 /usr/bin/gcc -nostdinc -I/usr/local/sss/i386-unknown-ssscore3.elf/include \
	-o foo.o -c foo.c
 /usr/bin/ld -Bstatic \
	-T/usr/local/sss/i386-unknown-ssscore3.elf/ldscript/lib/elf_i386_ssspc.x \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crt0s.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crti.o  \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtbegin.o \
	foo.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtend.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtn.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/libc.a -o foo 

ここで用いるべきスタートファイルとエンドファイルは、crt0s.o, crti.o, crtbegin.o, crtend.o, crtn.o である点に注意して下さい.

/usr/bin/gcc, /usr/bin/ld に換えて /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc, /usr/local/sss/i386-unknown-ssscore3.elf/ld を使うのであれば

 /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc -o foo.o -c foo.c
 /usr/local/sss/i386-unknown-ssscore3.elf/bin/ld -Bstatic \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crt0s.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crti.o  \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtbegin.o \
	foo.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtend.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/crtn.o \
	/usr/local/sss/i386-unknown-ssscore3.elf/lib/libc.a -o foo 
	

更にリンク(ld ではなく)に gcc を用いるのであれば

 /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc -static -o foo foo.c

4. /usr/bin/gcc と /usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc の違い

ネイティブ libc や UNIX 互換 libc を用いたコンパイルの方法を個別に見て行くと混乱を 招きやすが、/usr/bin/gcc と/usr/local/sss/i386-unknown-ssscore3.elf/bin/gcc (以下 クロスコンパイラ)の違いを理解しておくと解り易いと思います. 両者とも同じ CPU アーキテクチャ(i386)であるため、基本的にはサーチパスのデフォルト とリンクスペックが異なるだけであり、この点に注意して -nostdlib, -nostdlinc, -T 等 のコンパイルオプションを活用すれば、クロスコンパイラで FreeBSD 用のコードを作るこ とさえ可能です.

 デフォルトインクルードパス
   /usr/bin/gcc	/usr/include
   クロスコンパイラ	/usr/local/sss/i386-unknown-ssscore3.elf/include
 デフォルトライブラリパス
   /usr/bin/gcc	/usr/lib
   クロスコンパイラ	/usr/local/sss/i386-unknown-ssscore3.elf/lib
 リンクスペック
   /usr/bin/gcc	・/usr/lib 下のスタートファイル/エンドファイル(crt0.o 等)を
			  使用する.
			・デフォルトで shared ライブラリをリンクする.
   クロスコンパイラ	・/usr/local/sss/i386-unknown-ssscore3.elf/lib 下ののスタート
                         ファイル/エンドファイル(crt0.o 等)を使用する.
			・'-frame' オプションを付けると frame 対応のスタートファイル/
			  エンドファイルを使用する.
			・デフォルトで static ライブラリをリンクする.
			  '-sss' オプションを付けると libc_sss.a, libproc_sss.a,
			  libsss.a をリンクする.
                       
 ldscript
   /usr/bin/gcc	/usr/lib/ldscript/elf_i386.*
   クロスコンパイラ	/usr/local/sss/i386-unknown-ssscore3.elf/lib/ldscript/elf_i386_ssspc.*

リンクに(ld ではなく)gcc を用いた場合、リンクスペックに基づきスタートファイル/エン ドファイル(crt0.o 等)が暗黙の内に指定されます. リンクスペックはコンパイラに内挿されていますが、クロスコンパイラのリンクスペック については /usr/local/sss/i386-unknown-ssscore3.elf/lib/gcc-lib/i386-unknown-ssscore3.elf/2.95.4/specs に見ることができます.

5. /usr/bin/ld と /usr/local/sss/i386-unknown-ssscore3.elf/bin/ld の違い

/usr/bin/ld と /usr/local/sss/i386-unknown-ssscore3.elf/bin/ld (以下クロス用 ld) の違いは、デフォルトの ldscript が異なるだけです.

   /usr/bin/gcc	/usr/libdata/ldscripts/elf_i386.*
   クロス用 ld		/usr/local/sss/i386-unknown-ssscore3.elf/lib/ldscript/elf_i386_ssspc.*

6. /usr/bin/make と smake (/usr/local/sss/bin/smake) の違い

通常の BSD make (/usr/bin/make) が /usr/share/*.mk を参照するのに対して smake は /usr/local/sss/share/mk/*.mk を参照します. '/usr/bin/make -m /usr/local/sss/share/mk' として動作させる shell スクリプトと 言った方がわかりやすかもしれません. アプリケーション作成するには、smake を使うのが最もスマートです. 例えば、main.c, sub1.c, sub2.c から構成されるアプリケーションの Makefile は

	PROG= main
	SRCS= main.c sub1.c sub2.c
	FRAME= no
	NOMAN= yes
	.include <bsd.prog.mk>

ネィテイブ libc を用いるのでれば

	PROG= main
	SRCS= main.c sub1.c sub2.c
	LDFLAGS= -sss
	FRAME= no
	NOMAN= yes
	.include <bsd.prog.mk>

ここで、'FRAME=no' は、frame に対応しない static バイナリを作成することを意図 します.

															以上

Lab/SSS-PC


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS