リンカーとライブラリ

実行時リンカーが検索するディレクトリ

デフォルトでは、実行時リンカーがライブラリを検出する場所として認識する標準的な場所は 1 つだけで、32 ビットオブジェクトを処理する場合は/usr/lib、64 ビット SPARC オブジェクトを処理する場合は /usr/lib/sparcv9 です。この他のディレクトリを検索する場合は、実行時リンカーの検索パスに明示的に追加する必要があります。

動的な実行可能プログラムまたは共有オブジェクトは、付加された共有オブジェクトとリンクされ、これらの共有オブジェクトは、実行時リンカーによるプロセスの実行中に再び配置される必要がある従属物として記録されます。リンク編集中には、1 つまたは複数のパス名を出力ファイル内に記録できます。これらのパス名は、実行時リンカーが共有オブジェクトの従属物を検索する場合に使用されます。この記録されたパス名は、「実行パス」と呼ばれます。

-z nodefaultlib オプションを使用してオブジェクトを作成すると、実行時に、標準的な場所 (/usr/lib あるいは /usr/lib/sparcv9) を検索しないようにできます。このオプションを使用すると、オブジェクトのすべての依存関係はその実行パスを使用して検索されます。多くの場合はこのオプションを使用せず、ユーザーが実行時リンカーのライブラリ検索パスをどのように修正しても、最後の構成要素は必ず、32 ビットオブジェクトの場合は /usr/lib、64 ビット SPARC オブジェクトの場合は /usr/lib/sparcv9 です。


注 -

-デフォルトの検索パスは、実行時構成ファイルを使用して管理できます (「デフォルトの検索パスの設定」を参照)。ただし、オブジェクト作成者はこのファイルの存在に頼らず、実行パスあるいは標準的なシステムのデフォルト設定のみを使用して、オブジェクトがその依存関係を検索できるようにしてください。


コロンで区切られたディレクトリリストをともなう、-R オプションを使用すると、動的実行可能プログラムまたは共有ライブラリ内に実行パスを記録できます。次に例を示します。


$ cc -o prog main.c -R/home/me/lib:/home/you/lib -Lpath1 ¥
-Lpath2 file1.c file2.c -lfoo -lbar

上記の例では、動的実行可能プログラム prog 内に、実行パス /home/me/lib:/home/you/lib が記録されます。実行時リンカーは、共有オブジェクトの依存関係を配置する場合に、これらのパスを使用してから、デフォルトのロケーション /usr/lib を使用します。この場合、この実行パスは、libfoo.so.1libbar.so.1 の配置に使用されます。

リンカーは、複数の -R オプションを受け取り、コロンで区切られたこれらの指定内容をそれぞれ結合します。そのため、上記の例は、次のようにも示すこともできます。


$ cc -o prog main.c -R/home/me/lib -Lpath1 -R/home/you/lib ¥
-Lpath2 file1.c file2.c -lfoo -lbar

さまざまな場所にインストールされる可能性のあるオブジェクトについては、$ORIGIN 動的ストリングトークンを使用して、柔軟に実行パスを記録できます。「関連する依存関係の配置」を参照してください。


注 -

-R オプションを指定することによる履歴的に代替とは、環境変数 LD_RUN_PATH を設定して、リンカーがこれを使用できるようにすることです。LD_RUN_PATH および -R の適用範囲と機能は全く同じですが、この両方を指定した場合は、-R によって LD_RUN_PATH は上書きされます。