共有ライブラリお作法まとめ

ACさんから教えていただいた
Program Library HOWTO:
http://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/
非常によくまとまっていて疑問が氷解しました。
重要そうなところを引用します。

静的ライブラリ

.aは静的ライブラリ。arコマンドでオブジェクトファイルをまとめたもの。
静的ライブラリは -l オプションでリンクを行う

共有ライブラリ

すべての共有ライブラリは「soname」という特別な名前をもつ。
ディレクトリ名libxxx.so.バージョン番号
バージョン番号はインターフェースが変わったときに変わる。


すべての共有ライブラリは「realname」という特別な名前を持つ。
soname.マイナー番号.リリース番号


「linker name」 sonameからバージョン番号を除いたもの

ldconfig は、既に存在するファイルを調べ、real name へのシンボリックリンクとして soname 群を作成します
例えば、/usr/lib/libreadline.so.3 は完全記述の soname であり、これは ldconfig が /usr/lib/libreadline.so.3.0 というような何らかの real name に対するシンボリックリンクとして作成するものです。 /usr/lib/libreadline.so という linker name も作成するべきであり、それは、/usr/lib/libreadline.so.3 を参照するシンボリックリンクとなるでしょう。

配置場所

例えば、/usr/lib/libreadline.so.3 は完全記述の soname であり、これは ldconfig が /usr/lib/libreadline.so.3.0 というような何らかの real name に対するシンボリックリンクとして作成するものです。 /usr/lib/libreadline.so という linker name も作成するべきであり、それは、/usr/lib/libreadline.so.3 を参照するシンボリックリンクとなるでしょう。


この記述を見つけたときほっとした。なぜならよくやるから(ぉ。

検索対象となるディレクトリのリストは、/etc/ld.so.conf ファイル内に記述されています。 Red Hat から派生しているディストリビューションの多くは、通常 /etc/ld.so.conf ファイル内に /usr/local/lib を含めていません。私はこれをバグだと考えており、また、/usr/local/lib を /etc/ld.so.conf に追加することは、Red Hat から派生しているシステム上で多くのプログラムを走らせるのに必要な、共通の「修正」だと思っています。

ldconfig の実行タイミング

それから、あとで他のプログラムから利用されることになるキャッシュを /etc/ld.so.cache に書き込みます。これにより、ライブラリへのアクセスが非常に速くなります。結果として言えることは、DLL を追加したとき、または、DLL を削除したり、DLL ディレクトリのセットを変更したりしたときには必ず、ldconfig を実行しなければならない、ということです。

LD_LIBRARY_PATH

特定のプログラムを実行する際、一時的に別のライブラリを代替的に使用することができます。Linux では、環境変数 LD_LIBRARY_PATH に、標準的なディレクトリ群に先立ってライブラリ検索対象とすべきディレクトリ群を、コロンで区切って並べます。これは、新しいライブラリをデバッグするときや、特殊な目的のために非標準的なライブラリを使用するときなどに便利です。

共有ライブラリのインストールと使用

共有ライブラリを作成したら、それをインストールしたくなることでしょう。簡単な方法は、標準的なディレクトリ (例えば /usr/lib など) の一つに、そのライブラリをコピーし、ldconfig(8) を実行することです。

まず、共有ライブラリをどこかに作成する必要があるでしょう。それから、必要なシンボリックリンク、特に soname から real name へのリンクを作成する必要もあるでしょう (同様に、バージョン番号を全く指定しないユーザのため、バージョン番号の無い soname, つまり「.so」で終わる soname からのリンクも必要です)。最も簡単な方法は、次のとおり実行することです。

ldconfig -n directory_with_shared_libraries

最後に、プログラムをコンパイルするときに、使おうとしている全ての静的ライブラリと共有ライブラリについて、リンカに教えてやる必要があります。これは、-l オプションと -L オプションを使っておこないます。

ldd

ldd(1) を使えば、プログラムによって使用されている共有ライブラリのリストを見ることができます。例えば、次のようにタイプすれば、ls によって使用される共有ライブラリを確認できます。

ldd /bin/ls