app
ライブラリに依存し、次のようにlibbar.so
ロードする実行可能ファイルがあります。RPATH
$ORIGIN
$ readelf -d app
Dynamic section at offset 0xe08 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libbar.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/lib/]
実行可能ファイルへのシンボリックリンクからなる適切なディレクトリ構造で実行するのが最善ですlibbar.so
。
$ ls -R
.:
app@ lib/
./lib:
libbar.so@
- しかしリンカは、実行可能ファイルの元のファイルへのシンボリックリンクに沿ってディレクトリを実行可能ファイルに$ORIGIN
設定し、そこで依存関係パスを確認します。そうしないようにすることは可能ですか?したがって、ディレクトリパスの観点からlibファイルを検索すると、シンボリックリンクはファイルシステムの実際のファイル(検索の「エンドポイント」)として扱われます。
また、この問題のいくつかの推論は次のとおりです。
バイナリファイルを次のように設定すると便利です。複数の関係ディレクトリから依存関係を検索するたとえば、
$ORIGIN/
バイナリ自体で$ORIGIN/appname_dependencies/
(したがって、バイナリとその依存関係をディレクトリにコピーして実行できますが、システムが同じバイナリの複数のバージョンを使用して置き換えるより複雑な設定も可能です)。リクエストにより
RPATH
検索方法には、複数の依存検索パスが使用されます。:依存関係の「スラッシュ」名()はNEEDED Shared library: [./libbar.so]
検索パスを1つだけ設定します。さらに、単純化のために、依存関係解決パスはバイナリ自体に存在する必要があります。すべてのバイナリ(アプリケーションとすべての依存関係)をマージする機能リンクを含む完全な依存関係グラフ、ファイルをコピーする代わりに。そしてシンボリックリンクがより柔軟ハードリンクより:ファイルシステム全体にリンクされます。実際、私はLinuxクラスタのトレーニング環境で親ディレクトリへのハードリンクを完了できないこの問題に直面しました。
$ ln ../afile ln: creating hard link `./afile' => `../afile': Invalid cross-device link
答え1
もしあなたが本当に考えるこのようなシンボリックリンクを混在させるにはできる次の構成をビルドします。
- 実行可能ファイルを独自のディレクトリに移動
- 「一般」の場所から移動された実行可能ファイルでシンボリックリンクを作成します。
- 解決する共有ライブラリの実行可能ファイルディレクトリにシンボリックリンクを作成します。