リンカーとライブラリ

依存関係を持つ共有オブジェクト

共有オブジェクトは、独自の依存関係を持つことができます。実行時リンカーが検索するディレクトリでは、共有オブジェクトの依存関係を検索するために実行時リンカーが使用する検索規則について説明しています。共有オブジェクトがデフォルトディレクトリの /usr/lib (32 ビットオブジェクトの場合)、または /usr/lib/64 (64 ビットオブジェクトの場合) にないときは、実行時リンカーに対して検索場所を明示的に指示する必要があります。この種の条件を指示するために優先されるメカニズムは、リンカーの -R オプションを使用して、依存関係を持つオブジェクトに「実行パス」を記録するというものです。

次の例では、共有オブジェクト libfoo.so は、libbar.so に対する依存関係を持ちます。これは、実行時にディレクトリ/home/me/lib にあるものと予期されますが、ない場合はデフォルト位置にあるものと予期します。


$ cc -o libbar.so -G -K pic bar.c
$ cc -o libfoo.so -G -K pic foo.c -R/home/me/lib -L. -lbar
$ dump -Lv libfoo.so

libfoo.so:

  **** DYNAMIC SECTION INFORMATION ****
.dynamic:
[INDEX] Tag      Value
[1]     NEEDED   libbar.so
[2]     RUNPATH  /home/me/lib
.........

共有オブジェクトでは、依存関係を検索するために必要な実行パスすべてを指定する必要があります。動的実行可能ファイルに指定された実行パスはすべて、動的実行可能ファイルの依存関係を検索するためにだけ使用されます。これらの実行パスは、共有オブジェクトの依存関係を検索するために使用されることはありません。

これに対して、環境変数 LD_LIBRARY_PATH は、より大域的な適用範囲を持ちます。この変数を使用して指定されたパス名はすべて、実行時リンカーによって、すべての共有オブジェクト依存関係を検索するために使用されます。この環境変数は、実行時リンカーの検索パスに影響を与える一時的なメカニズムとして便利ですが、製品版ソフトウェアではできるだけ使用しないようにしてください。詳細は、実行時リンカーが検索するディレクトリを参照してください。