リンカーとライブラリ

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

これまでこの章で示した例のほとんどは、共有オブジェクトの依存関係が動的実行可能ファイル内でどのように維持されるかを示していますが、共有オブジェクトが独自の依存関係を持つことは非常に一般的です (詳細は、「共有オブジェクトの処理」を参照)。

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


$ 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]     RPATH    /home/me/lib
.........

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

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

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