SSS-PC には、そのの前身 SSS-CORE から継承された libc と FreeBSD 4.x から移植された libc が在ります. 前者を「ネィテイブ libc」、後者を「UNIX 互換 libc」と呼びます.
SSS-PC 専用でファイルシステムに依存しないアプリーケーションには「ネィテイブ libc」、 UNIX 上で動作するアプリケーションを移植する場合は「UNIX 互換 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
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
ネイティブ 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 に見ることができます.
/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.*
通常の 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 バイナリを作成することを意図 します.
以上