RPATHの$ ORIGINがシンボリックリンクに従わないようにする方法は?

RPATHの$ ORIGINがシンボリックリンクに従わないようにする方法は?

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ファイルを検索すると、シンボリックリンクはファイルシステムの実際のファイル(検索の「エンドポイント」)として扱われます。

また、この問題のいくつかの推論は次のとおりです。

  1. バイナリファイルを次のように設定すると便利です。複数の関係ディレクトリから依存関係を検索するたとえば、$ORIGIN/バイナリ自体で$ORIGIN/appname_dependencies/(したがって、バイナリとその依存関係をディレクトリにコピーして実行できますが、システムが同じバイナリの複数のバージョンを使用して置き換えるより複雑な設定も可能です)。

  2. リクエストによりRPATH検索方法には、複数の依存検索パスが使用されます。:依存関係の「スラッシュ」名()はNEEDED Shared library: [./libbar.so]検索パスを1つだけ設定します。さらに、単純化のために、依存関係解決パスはバイナリ自体に存在する必要があります。

  3. すべてのバイナリ(アプリケーションとすべての依存関係)をマージする機能リンクを含む完全な依存関係グラフ、ファイルをコピーする代わりに。そしてシンボリックリンクがより柔軟ハードリンクより:ファイルシステム全体にリンクされます。実際、私はLinuxクラスタのトレーニング環境で親ディレクトリへのハードリンクを完了できないこの問題に直面しました。

        $ ln ../afile 
        ln: creating hard link `./afile' => `../afile': Invalid cross-device link
    

答え1

もしあなたが本当に考えるこのようなシンボリックリンクを混在させるにはできる次の構成をビルドします。

  • 実行可能ファイルを独自のディレクトリに移動
  • 「一般」の場所から移動された実行可能ファイルでシンボリックリンクを作成します。
  • 解決する共有ライブラリの実行可能ファイルディレクトリにシンボリックリンクを作成します。

関連情報