ライブラリの基礎知識

2000.03.11 初版

ライブラリは、再利用を目的として作成されたコンパイル済みの関数の集合です。 linux以外のOS別 Shared Library の構築・使用ガイドは、 http://www.dais.is.tohoku.ac.jp/~kabe/vsd/dynald.htmlへどうぞ。 ライブラリの名前の先頭は、lib から始まります。Linux のライブラリには次の3種類あります。 スタティックライブラリは、コンパイル時にコードがプログラムに組込まれます。 モジュールサイズが大きくなりますが、別のマシンにバイナリで配布したときに そのライブラリがなくても動作します。 .a で終わるファイルです。
共有ライブラリは、プログラムの実行時にロードされます。マシンによっては、 その共有ライブラリがなかったり、バージョンが違ったりして、動作しないことがあります。 .so と .sa で終わるファイルです。.sa は、古い a.out 形式で使われた共有ライブラリです。
ダイナミックライブラリは、共有ライブラリの1種です。実行時に 関数を使って ロードしたり、アンロードしたりできます。
ダイナミックライブラリは、モジュールのロード位置に依存しないコードですので gcc で -fPIC オプションをつけてコンパイルします。 この辺の説明は、 ELF HOWTOをみましょう。

共有ライブラリを作成するには、gcc で -Wl,-soname,オプションを使います。 以下の例は、libxxx.so.1.0 という共有ライブラリを作成しています。 その後、 /sbin/ldconfig でリンク名(libxxx.so.1) を作成します。 最後にリンカーは、 libxxx.so という名前で探しますのでリンクを手動で張ります。

$ gcc -fPIC -c xxx.c
$ gcc -shared -Wl,-soname,libxxx.so.1 -o libxxx.so.1.0 xxx.o
# cp libxxx.so.1.0 /usr/lib
# /sbin/ldconfig /usr/lib
# ln -s /usr/lib/libxxx.so.1 /usr/lib/libxxx.so

スタティックライブラリは、ar コマンドで作成します。ranlib コマンドは、 BSD系のUNIX で使われており、各ライブラリの先頭に __.SYMDEF というメンバを 追加します。これは、リンクを高速にするためです。 GNUツールを使うlinux では、不要ですがまあ実行してもいいようです。 strip コマンドは、オブジェクトファイルの中のsymbol table を削除します。 コマンドをインストールする場合には、 strip コマンドを実行します。

$ ar rv libxxx.a xxx.o
$ ranlib libxxx.a
$ strip libxxx.a

通常、ライブラリは、スタティックライブラリ、共有(ダイナミック)ライブラリの 2つが提供されます。リンカーは、まず共有ライブラリを検索して、 次にスタティックライブラリを探してリンクします。
スタティックライブラリを使う場合は、次のようにリンクします。
$ gcc sample.c -o sample /usr/lib/libxxxx.a
共有ライブラリを使う場合は、次のようにリンクします。
$ gcc sample.c -o sample -lxxxx

プログラムがどんな共有ライブラリを使っているか調べるには ldd コマンドを使います。
$ ldd bsendm
   libbsmtp.so.1 => /usr/lib/libbsmtp.so.1 (0x40016000)
   libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x4002e000)
   libm.so.6 => /lib/libm.so.6 (0x40070000)
   libc.so.6 => /lib/libc.so.6 (0x4008c000)
   /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Home


Copyright 1999-2000 Tatsuo Baba,All rights reserved.