*SSS-PC のアプリケーション開発について (2005.10.25 修正) #contents+ #contents **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]]