リンカーは、いくつかの場所で、指定された順序でライブラリを検索します。検索の対象となるのは、標準のパスと、コンパイラオプション -Rpath、-llibrary、-Ldir で指定された場所、環境変数 LD_LIBRARY_PATH で設定されている場所です。
リンカーによって使用される標準のライブラリ検索パスはインストールパスによって決定されます。これらのパスは、静的な読み込みか動的な読み込みかによって異なります。標準インストールは、Sun Studio コンパイラソフトウェアを /opt/SUNWspro/ に配置します。
静的リンカーは、実行可能ファイルの構築中に、次のパス (ほかにもあります) で、指定された順序で、ライブラリを検索します。
/opt/SUNWspro/lib |
Sun Studio の共有ライブラリ |
/usr/ccs/lib/ |
SVr4 ソフトウェアの標準の場所 |
/usr/lib |
UNIX ソフトウェアの標準の場所 |
前述のパスは、リンカーによって使用されるデフォルトのパスです。
動的リンカーは、実行時に、指定された順序で、共有ライブラリを検索します。
ユーザーが -Rpath で指定したパス
/opt/SUNWspro/lib/
/usr/lib 標準 UNIX デフォルト
検索パスは、実行可能ファイルに組み込まれます。
LD_LIBRARY_PATH 環境変数を使用して、-llibrary オプションで指定したライブラリをリンカーが検索すべきディレクトリパスを指定します。
複数のディレクトリはコロンで区切って指定できます。通常、 LD_LIBRARY_PATH 変数は、コロンで区切ったディレクトリのリストを、次のようにセミコロンで区切って 2 つ持ちます。
dirlist1;dirlist2
最初に、dirlist1 のディレクトリが検索され、次に、コマンド行上で明示的に指定された -Ldir ディレクトリが検索され、最後に、dirlist2 と標準ディレクトリが検索されます。
つまり、次のように、複数の -L でコンパイラが呼び出された場合
f95 ... -Lpath1 ... -Lpathn ...
検索順序は次のようになります。
dirlist1 path1 ... pathn dirlist2 standard_paths
LD_LIBRARY_PATH 変数に、コロンで区切ったディレクトリリストが 1 つだけ含まれる場合、そのリストは dirlist2 として解釈されます。
Solaris オペレーティング環境では、64 ビットの依存関係を検索するときに、類似の環境変数 LD_LIBRARY_PATH_64 を使用して LD_LIBRARY_PATH を無効にできます。詳細は、Solaris の『リンカーとライブラリ』および ld(1) マニュアルページを参照してください。
32 ビット SPARC プロセッサでは、LD_LIBRARY_PATH_64 は無視されます。
LD_LIBRARY_PATH だけを定義している場合は、32 ビットと 64 ビットの両方のリンクに使用されます。
LD_LIBRARY_PATH と LD_LIBRARY_PATH_64 を定義している場合は、32 ビットのリンクには LD_LIBRARY_PATH が使用され、64 ビットのリンクには LD_LIBRARY_PATH_64 が使用されます。
実際に運用するソフトウェアでは、可能なかぎり LD_LIBRARY_PATH 環境変数を使用しないでください。実行時リンカーの検索パスに影響を与える一時的なメカニズムとしては便利ですが、この環境変数を参照できる動的な実行可能ファイルはすべてその検索パスを変更します。そのため、予想できない結果になるか、パフォーマンスが低下する可能性があります。
-llibrary コンパイラオプションを使用して、リンカーが外部参照を解決するときに検索する追加のライブラリを指定します。たとえば、オプション -lmylib は、ライブラリ libmylib.so か libmylib.a を検索リストに追加します。
リンカーは標準ディレクトリパスを探して、追加の libmylib ライブラリを見つけます。-L オプション (および、LD_LIBRARY_PATH 環境変数) は、標準パス以外でライブラリを探す場所をリンカーに伝えるパスのリストを作成します。
libmylib.a がディレクトリ /home/proj/libs にある場合、オプション –L/home/proj/libs は、実行可能ファイルを構築するときに探すべき場所をリンカーに伝えます。
demo% f95 -o pgram part1.o part2.o -L/home/proj/libs -lmylib |
特定の参照が解決されていない場合、ライブラリは 1 度だけ検索され、さらに、検索中のその時点で未定義のシンボルだけが検索されます。コマンド行上に複数のライブラリをリストする場合、これらのライブラリは、コマンド行に指定された順序で検索されます。 -llibrary オプションは、次のように配置します。
-llibrary オプションは .f、.for、.F、.f95、または .o ファイルのあとに配置します。
libx 中の関数を呼び出し、これらの関数が liby 中の関数を参照する場合、-lx は -ly より前に配置します。
-Ldir オプションは、dir ディレクトリパスをライブラリ検索リストに追加します。リンカーは、まず、-L オプションで指定されたディレクトリでライブラリを検索し、次に、標準ディレクトリで検索します。このオプションは、適用する –llibrary オプションより前に配置された場合だけ有効です。
動的ライブラリで、ライブラリ検索のパスと読み込みの順序の変更は、静的リンクのときとは異なります。実際のリンクは、構築時ではなく、実行時に行われます。
実行ファイルを構築するとき、リンカーは共有ライブラリへのパスを実行可能ファイル自身に記録します。これらの検索パスは、-Rpath オプションで指定できます。対照的に、-Ldir オプションは、構築時に -llibrary オプションで指定されたライブラリを見つける場所を示しますが、このパスをバイナリ実行可能ファイルに記録しません。
実行可能ファイルが作成されたときに構築されるディレクトリパスは、dump コマンドを使用して表示できます。
例: a.out に構築されたディレクトリパスをリストします。
demo% f95 program.f -R/home/proj/libs -L/home/proj/libs -lmylib demo% dump -Lv a.out | grep RPATH [5] RPATH /home/proj/libs:/opt/SUNWspro/lib |
実行時、リンカーは、実行可能ファイルに必要な動的リンクを探す場所を次から決定 します。
実行時の LD_LIBRARY_PATH の値
実行可能ファイルが構築されたときに -R で指定されたパス
すでに説明したように、LD_LIBRARY_PATH の使用は予想できない副作用があるので、お勧めできません。
必要なライブラリを見つけることができなかったとき、動的リンカーは次のようなエラーメッセージを発行します。
ld.so: prog: fatal: libmylib.so: can't open file: |
メッセージは、そこにあるべきライブラリが存在しなかったことを示しています。実行可能ファイルを構築したときには共有ライブラリのパスを指定したが、そのあとでライブラリが移動された可能性があります。たとえば、/my/libs/ 中のユーザー独自の動的ライブラリを使用して a.out を構築し、そのあとでライブラリをほかのディレクトリに移動した場合などです。
ldd を使用して、実行可能ファイルがライブラリを検索する場所を検出します。
demo% ldd a.out libfui.so.1 => /opt/SUNWspro/lib/libfui.so.1 libfai.so.1 => /opt/SUNWspro/lib/libfai.so.1 libfai2.so.1 => /opt/SUNWspro/lib/libfai2.so.1 libfsumai.so.1 => /opt/SUNWspro/lib/libfsumai.so.1 libfprodai.so.1 => /opt/SUNWspro/lib/libfprodai.so.1 libfminlai.so.1 => /opt/SUNWspro/lib/libfminlai.so.1 libfmaxlai.so.1 => /opt/SUNWspro/lib/libfmaxlai.so.1 libfminvai.so.1 => /opt/SUNWspro/lib/libfminvai.so.1 libfmaxvai.so.1 => /opt/SUNWspro/lib/libfmaxvai.so.1 libfsu.so.1 => /opt/SUNWspro/lib/libfsu.so.1 libsunmath.so.1 => /opt/SUNWspro/lib/libsunmath.so.1 libm.so.1 => /usr/lib/libm.so.1 libc.so.1 => /usr/lib/libc.so.1 libdl.so.1 => /usr/lib/libdl.so.1 /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1 |
可能であれば、適切なディレクトリにライブラリを移動またはコピーするか、リンカーが検索するディレクトリ中にそのディレクトリへのソフトリンクを作成します (ln -s を使用します)。または、LD_LIBRARY_PATH が正しく設定されていない可能性があります。LD_LIBRARY_PATH が実行時に必要なライブラリへのパスを含んでいるかどうかを検査します。