*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]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS