リンカーとライブラリ

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

実行時リンカーが依存関係を調べるときに検索する場所は、デフォルトの 1 か所だけです。この場所は、32 ビットオブジェクトを処理する場合は /usr/lib、64 ビットオブジェクトを処理する場合は /usr/lib/64 です。この他のディレクトリを検索する場合は、実行時リンカーの検索パスに明示的に追加する必要があります。

動的実行可能ファイルまたは共有オブジェクトが別の共有オブジェクトとリンクされるとき、これらの共有オブジェクトは依存関係として記録されます。このような依存関係は、プロセスの実行中に実行時リンカーによって再配置される必要があります。リンク編集中には、1 つまたは複数の検索パスを出力ファイル内に記録できます。これらの検索パスは、実行時リンカーが依存関係を検索するときに使用されます。この記録された検索パスは、「実行パス」と呼ばれます。

-z nodefaultlib オプションを使用すると、実行時にデフォルトの場所を検索しない特別なオブジェクトを作成できます。 このオプションを使用すると、オブジェクトのすべての依存関係はその実行パスを使用して検索されます。このオプションを使用しない場合、どれだけ検索パスを実行時リンカーに指定しても、最後の要素は常にデフォルトの場所になります。つまり、32 ビットオブジェクトの場合は /usr/lib、64 ビットオブジェクトの場合は /usr/lib/64 です。


注 –

デフォルトの検索パスは、実行時構成ファイルを使って管理できます。デフォルトの検索パスの設定を参照してください。 ただし、オブジェクト作成者はこのファイルの存在に依存すべきではありません。常に、実行パスまたはデフォルトの場所だけでオブジェクトの依存関係を検索できるようにする必要があります。


コロンで区切られたディレクトリリストを指定する、-R オプションを使用すると、動的実行可能ファイルまたは共有オブジェクト内に実行パスを記録できます。次の例では、動的実行可能ファイル prog 内に、実行パス /home/me/lib:/home/you/lib が記録されます。


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

共有オブジェクトの依存関係を取得するとき、実行時リンカーはまず上記パスを検索してから、デフォルトの場所を検索します。この場合、この実行パスは、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 は上書きされます。