ダイナミックリンクライブラリ用の rpath はありますか?

ダイナミックリンクライブラリ用の rpath はありますか?

私が取り組んでいるプロジェクトでは、コードが使用する一部の DLL をシステム以外のディレクトリに保存しています。それらをシステム ディレクトリに配置したくないので、実行可能ファイルには DLL を見つけるための rpath が設定されています。ただし、ライブラリが追加されるにつれて、そのディレクトリ内の他の DLL に依存する DLL が存在するようになりました。

これらのライブラリは、リンカーが探しているディレクトリ (システム ディレクトリなど) に配置されていないため、依存する DLL を見つけることができません。

DLL にこの特定の非システム ディレクトリを検索させる方法はありますか? rpath などですか? また、ライブラリではどのように実行されますか? プロジェクトで使用されているビルド システムは CMake です。これが回答に役立つと思います。

ライブラリに rPath タグがないため、この回答は機能しません。https://unix.stackexchange.com/a/272286/4193

を使用することを検討しましたがLD_LIBRARY_PATH、それは機能しますが、入力するのが面倒で、他の人にアプリを使用してもらうのにはあまり適していません。ライブラリにタグを追加する方法があればrPath、それが最善のオプションになります。

以前の関連する質問と回答へのポインタをいただければ幸いです。

答え1

ダイナミックリンクライブラリ用の rpath はありますか?

はい、あります。ELF-Wl,-rpath実行ファイルと同じようにELF共有オブジェクトを使用できます。私が掲載した小さな例をクローンしてください。 ここ:

git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0

実行しmakeてコンパイルします。ELF 実行ファイルに必要なライブラリを確認しますmain

$ readelf -d ./main

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libtwo.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [.]
(...)

そして、次の方法で必要なライブラリを確認しますlibtwo.so

$ readelf -d ./libtwo.so

Dynamic section at offset 0xe38 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libone.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [libs]
 (...)

ご覧のとおり、両方mainともlibtwo.so共有オブジェクトが必要であり、両方とも rpath が設定されています。./main を実行するために LD_LIBRARY_PATH を設定する必要はありません。

$ ./main
I'm in bar()

main は常に現在のディレクトリ内で libtwo.so 依存関係を探し.、libtwo.so は常にディレクトリ内で libone.so 依存関係を探しますlibslibsがない場合、./main は起動しません。

$ mv libs libs.bak
$ ./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory

復元する:

$ mv libs.bak libs
$ ./main
I'm in bar()

答え2

これをシステムの一部として考えたくない場合は、ユーザー アプリケーションとしてそのまま使用してください。

~/.local/lib/に追加すると、そこにすべてを置くことができます。のようLD_LIBRARY_PATHに部分的なFHS構造を作成するだけです。~/.local/置き場ライブラリそして共有そうすれば、先行する環境変数を使用してプログラムを呼び出す必要がなくなります。他のすべてのシステムでは、このディレクトリにライブラリ パス環境変数を追加するだけで済みます。非常に整然としていて、Unix 的です。

この解決策も拒否する場合、残された可能性は 1 つだけです。すべてのシステムで想定される固定パスを使用するか、パスを含み、これも想定される環境変数を使用するかのいずれかです。

関連情報