注意
本内容は煩雑である上、多くのアプリケーションにおいて本内容に該当する可能性は低いと考えられます。
アプリケーション作成時のテスト等において、アプリケーションが予期せず実行できない場合(下記で説明するように、libF3のロードに失敗するか、他ライブラリと競合が起こり実行時エラーとなる場合)にのみ、参考にすることをお勧めします。
Fujitsu Enterprise Postgresが同梱するライブラリを利用するアプリケーションについて、例えば、以下のように、libF1,libF2,libF3 が他のアプリケーションやライブラリと以下のような依存関係を持つ場合、アプリケーションビルド時に、libF3を直接リンクするようビルドオプションに指定してください。
直接リンクしない場合、アプリケーション実行時にLD_LIBRARY_PATH にlibF3 が格納されるパスを指定してください。
上記以外の場合、アプリケーション実行時にエラーとなる可能性があります。
例
以下を前提とした例で説明します。
アプリケーションとライブラリの間に、以下のような依存関係がある。
apl1->libF1->libF2 (apl1がlibF1を必要とし、libF1がlibF2を必要とする)
apl1->libA->libF3->libF2 (apl1がlibAを必要とし、libAがlibF3を必要とし、libF3がlibF2を必要とする)
libF1、libF2、libF3はFujitsu Enterprise Postgresが同梱するライブラリである。
一般的にライブラリのロードにおいて、あるlibAがlibBを必要とし、libBがlibCを必要とする場合、libBの探索にはlibAに設定されたDT_RUNPATHの値のみが利用され、libCの探索にはlibBに設定された DT_RUNPATH の値のみが利用されます。
上記の「libF3をapl1に直接リンクしない場合」の図において言えば、libF1の探索では、apl1に設定されたDT_RUNPATHの値が利用されます。libF2 の探索では、libF1 に設定されたDT_RUNPATHの値が利用されます。それぞれのDT_RUNPATHには、「Fujitsu Enterprise Postgresのインストールディレクトリ/lib」が設定されているため、libF1やlibF2を探索した際、 Fujitsu Enterprise Postgres が同梱するlibF1、libF2 を発見し、それらをロードできます。
しかし、libF3 の探索では、Fujitsu Enterprise Postgres が同梱する libF3 をロードできません。libF3の探索では、libAに設定されたDT_RUNPATHの値を利用しますが、libAにはDT_RUNPATHの値が設定されていないためです。
そのため、libF3を見つけることができずlibF3 のロードに失敗するか、または、マシン中に存在する、期待しないlibF3を発見し、それをロードしても、Fujitsu Enterprise Postgres が同梱するlibF2 との間で競合が起こり、実行時エラーとなる可能性があります。(ここでの競合とは、libF3で参照するシンボルが、libF2で定義されていないことです。)
上記の「libF3 をapl1に直接リンクする場合」の図で示したように、アプリケーションにlibF3を直接リンクすることで、アプリケーションのDT_RUNPATH を利用し、Fujitsu Enterprise Postgresが同梱するlibF3 をロードすることができます。または、LD_LIBRARY_PATH を設定することで、Fujitsu Enterprise Postgres が同梱するlibF3 をロードすることができます。