GNU/Linux >> Linux の 問題 >  >> Linux

RUNPATH ではなく RPATH を使用しますか?

バイナリを出荷するときは、ライブラリの検索パスを調整するなどして、ユーザーが自分のシステムの仕様に合わせてバイナリを調整できる手段を提供することをお勧めします。

ユーザーは通常 LD_LIBRARY_PATH を調整できます そして /etc/ld.so.conf 、どちらも DT_RPATH よりも優先順位が低い 、つまり、バイナリでハードコードされているものをオーバーライドすることはできませんが、 DT_RUNPATH を使用する場合 代わりに、ユーザーは LD_LIBRARY_PATH でオーバーライドできます .

(FWIW、私は ld.so.conf だと思います DT_RUNPATH よりも優先する必要があります 、しかし、とにかく、少なくとも LD_LIBRARY_PATH を取得しました ).

また、 DT_RPATH を使用するという上記の提案には強く反対します . IMO、ネザー DT_RPATH を使用するのが最善です DT_RUNPATH ではない 出荷されたバイナリで。

すべての依存ライブラリを実行可能ファイルとともに出荷し、インストール後に JustWork(tm) を確実に動作させたい場合は、DT_RPATH を使用します。 .


<ブロック引用>

では、なぜ RPATH が推奨されなくなり、RUNPATH が推奨されるようになったのでしょうか?

DT_RPATH が導入されたとき、他のすべてのパラメーターよりも優先されました。これにより、開発目的であってもライブラリ検索パスをオーバーライドすることができなくなりました。そのため、LD_LIBRARY_PATH よりも優先順位の低い別のパラメーター LD_RUNPATH が導入されました。

詳細については、Ulrich Drepper によって書かれた「共有ライブラリの書き方」を参照してください。 .


Chill の答えはまさにそのとおりです。最近読んだ glibc ソース ([master 8b0ccb2]、2.17) から、単純に色を追加したかっただけです。明確にするために、特定のレベルで指定された場所にライブラリが見つからない場合、次のレベルが試行されます。ライブラリが特定のレベルで見つかった場合、検索は停止します。

動的ライブラリ検索順序:

<オール>
  • DT_RUNPATH が設定されていない限り、ELF バイナリの DT_RPATH。
  • setuid/setgid でない限り、LD_LIBRARY_PATH エントリ
  • ELF バイナリの DT_RUNPATH
  • リンク時に -z nodeflib を指定しない限り、/etc/ld.so.cache エントリ
  • /lib、-z nodeflib でない限り /usr/lib
  • 完了、「見つかりません」。

  • Linux
    1. コアがダンプされましたが、コア ファイルが現在のディレクトリにありませんか?

    2. インストールしますが、デフォルトのディレクトリにはしませんか?

    3. rc.local でスクリプトを実行します:スクリプトは機能しますが、起動時には機能しません

    1. Linuxは上書きではなくコピーする方法は?

    2. php.ini は変更されますが、ubuntu では効果がありません

    3. 使用していないときにposix共有メモリを削除しますか?

    1. Linux –なぜSuだけでなくSuを使用するのですか?

    2. ディレクトリを比較しますが、ファイルの内容は比較しませんか?

    3. ディスク全体に dd しますが、空の部分は必要ありません