2011-11-01 12 views
17

このページ - - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/はld.soでライブラリ検索の順番についてこう述べています。その後、はRPATHを使用しますが、RUNPATHは使用しませんか?

Unless loading object has RUNPATH: 
    RPATH of the loading object, 
     then the RPATH of its loader (unless it has a RUNPATH), ..., 
     until the end of the chain, which is either the executable 
     or an object loaded by dlopen 
    Unless executable has RUNPATH: 
     RPATH of the executable 
LD_LIBRARY_PATH 
RUNPATH of the loading object 
ld.so.cache 
default dirs 

とは、お勧め:

あなたはどちらかRPATHを使用していない実行パスまたは LD_LIBRARY_PATHを確保するため、バイナリを出荷

実行前に設定されます。

RUNPATH種類-のはRPATHので、間接的な動的ロードをキャンセル期待通りに動作しないので、だから、RUNPATHRPATHを使用して悪いのですか?しかし、なぜRPATHが非難されてRUNPATHになったのですか?

誰かが状況を説明できますか?

答えて

13

バイナリを出荷する際には、ユーザがバイナリを自分のシステムの仕様に合わせる、つまりライブラリ検索パスを調整する手段を提供するのがよいでしょう。

ユーザーは一般的に、あなたが代わりにDT_RUNPATHを使用する場合、ユーザーがLD_LIBRARY_PATHでそれをオーバーライドすることができ、一方、あなたは、バイナリにハードコードされたものをオーバーライドすることはできませんつまり、DT_RPATHよりも低い優先順位であり、どちらも、LD_LIBRARY_PATH/etc/ld.co.confを微調整することができます。

(FWIW、ld.so.confDT_RUNPATHよりも優先すべきですが、とにかく少なくともLD_LIBRARY_PATHがあると思います)。

また、上記の提案には、DT_RPATHを使用することに強く反対します。 IMO、nether DT_RPATHを使用しないでください。DT_RUNPATHは出荷されたバイナリではありません。

あなたが実行可能で、すべての依存ライブラリを出荷し、確保したい

ない限り、その物事JustWork(tm)のインストール後に、この場合の使用DT_RPATHインチ

+1

問題は、RPATHよりもRUNPATHが推奨され、RPATHは推奨されていませんが、現在RUNPATHはすべてのシステムでサポートされていません。私は今日**アプリケーションの作業をするために何をしていますか? Qtの記事にあるように、プラグインを使うときはRATHPATH以上のRPATHを使うと便利です。ここでは状況が非常に混乱しています – zaharpopov

+1

@ zaharpopov、私がお勧めしたいと思う最良のアプローチは、ターゲットプラットフォームにうまく統合されたアプリケーションを生成することです。これには、プラットフォームの競合バージョンを配布しない共有ライブラリ*。私はこれが問題の根源だと思って、DT_RPATHの周りにハックとスラッシュを入れ、友人はそれを解決する代わりに問題を横取りしようとする間違った方向の努力です。 – chill

+1

これは簡単ではありません。 Qtの問題は、Qtライブラリの新しいバージョンがシステム上に存在するよりも必要だったということでした。いくつかのシステムではQt SOが古くなっていますので、どうしたらいいですか?私はあなたが特定のバージョン – zaharpopov

10

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

動的ライブラリの検索順序:ELFバイナリに

  1. DT_RPATH、DT_RUNPATHセットしない限り。
  2. LD_LIBRARY_PATHエントリ、ない限りELFバイナリ
  3. /etc/ld.so.cacheエントリにsetuid/setgidされ
  4. DT_RUNPATH、-z nodeflibはリンク時に
  5. /libが与えられない限り、ない限りは/ usr/libに - z nodeflib
  6. 完了、「見つかりません」。
4

しかし、なぜ、その後RPATHはRUNPATHの非推奨しまいましたか?

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

詳細はウルリック・ドレパーによって書かれ"How to write shared libraries"仕事で見つけることができます。

+1

この答えは 'DT_RUNPATH'の必要性を説明しますが、' DT_RPATH'が非難される理由は説明しません。どちらも独自の使い方をしており、 'DT_RUNPATH'は' LD_LIBRARY_PATH'が使用されているときに 'libtool'を壊します:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 – vinc17

関連する問題