次のページ 前のページ 目次へ

3. プログラムの構築

3.1 一般的なプログラム

プログラムを ELF 形式でコンパイルする場合、いつものように gcc を使います。a.out 形式でコンパイルする場合、gcc -b i486-linuxaout としてください。

$ cat >hello.c
main() { printf("hello, world\n"); }
^D
$ gcc -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable i386 (386 and up) Version 1
$ ./hello
hello, world

さて、そろそろ「a.out 形式のコンパイラが出力するバイナリのデフォルト名 が a.out なら、ELF コンパイラの出力するバイナリのデフォルト名 は何というの?」という質問に答えるべき時でしょう。答は、「やっぱり a.out」なんです。残念でしたか? :-)

3.2 ライブラリの作り方

libfoo.so を共有ライブラリとして構築したい場合、基本的な手順 は以下のようになります。

$ gcc -fPIC -c *.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
$ ln -s libfoo.so.1 libfoo.so
$ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

これにより、libfoo.so.1.0 と呼ばれる共有ライブラリと ld 用の シンボリックリンク(libfoo.so)、動的リンカ用のシンボリックリン ク(libfoo.so.1)が作成されます。ライブラリのテストの際は、最後 に示したように、現在のディレクトリを LD_LIBRARY_PATH に加えて 試してみましょう。

ライブラリが正しく動くことが確認できれば、適切な場所、例えば /usr/local/lib に移し、リンクを張り直しましょう。 libfoo.so のリンクは libfoo.so.1 へ張られているので、 バージョン番号のマイナーチェンジがあってもリンクを張り直す必要はありま せん。libfoo.so.1.0 から libfoo.so.1 へのリンクは、 たいていのシステムでは ldconfig が起動時に更新します。

$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )

3.3 a.out 形式の構築

ELF 環境の中でも古い a.out 形式のバイナリを作成しなければならない 場合があるかも知れません。「普通の」プログラムの場合、必要なことは gcc を起動する時に -b i486-linuxaoutフラグを使って a.out 用のコン パイラを起動し、(もし) ld を起動する場合は -m i386linux フラ グを使います。a.out 形式の DLL 共有ライブラリを未だに必要とする人は、、 可哀想に。私の知る限りでは、一言で言えば「動きません」。別の方法を御存 知ならばメールで私に教えてください。


次のページ 前のページ 目次へ