/usr/lib または /usr/lib64 にすべてインストールされる複数の動的ライブラリで構成される大規模なプロジェクトがあるとします。ここで、ライブラリの 1 つが別のコンパイル済みライブラリを呼び出すとします。相互に依存する両方のライブラリを同じ場所に配置すると、ld プログラムは 2 つのライブラリが相互に呼び出すことを許可できますか?
3 に答える
答えはおそらくイエスですが、2 つのライブラリ間で循環参照(つまりliba.so
、 function を含み、 から関数fa
を呼び出し、fb
から関数をlibb.so
呼び出す) を持つのは非常に悪い設計です。ga
liba.so
2 つのライブラリを 1 つにマージする必要がありますlibbig.so
。心配はいりません。ライブラリは非常に大きくなる可能性があります。(一部の企業は、数百メガバイトのコードの Linux ライブラリを持っています)。
Debian のパッケージのgold
リンカーbinutils-gold
が役立つはずです。の古いリンカーよりも高速に動作しますbinutils
。
はい、それらの場所がディレクトリのセットに存在する限り、ld
ライブラリを検索しますLD_LIBRARY_PATH
。環境変数を使用して、このセットをオーバーライドできます。
このマニュアルを参照してください。疑問が解決します。
ランタイム ダイナミック リンカー /lib/ld-linux* (/usr/bin/ld ではなく) を意味する場合、通常は /usr/lib と /usr/lib64 を含む LD_LIBRARY_PATH でライブラリを検索します。
一般に、/lib/ld-* は実行時に .so ライブラリに使用されます。/usr/bin/ld は、コンパイル時に .a ライブラリに使用されます。
ただし、ライブラリが dlopen() などを使用してお互いを見つけている場合 (プラグインなど)、お互いを見つけるための別のメカニズムを持っている可能性があります。たとえば、多くのプラグイン システムは dlopen を使用して、特定の (1 つまたは複数の) ディレクトリ内のすべてのライブラリを読み取ります。