web-dev-qa-db-ja.com

rpathの正しい使用法(相対対絶対)

バイナリまたはライブラリを構築するときは、rpathを指定します。つまり、.

-Wl,rpath,<path/to/lib>

バイナリの実行時に必要なライブラリを見つける場所をリンカに指示します。

ここでの絶対パスと相対パスに関するUNIX哲学は何ですか? libをどこからでも見つけることができるように、絶対パスを使用する方が良いですか?または、ディレクトリ全体をコピーしたり、より高いレベルのパスの名前を変更したりしてもバイナリが使用できなくなることがないように、相対的なものにする方がよいでしょうか。

更新

$Originを使用することは、通常、バイナリを構築するための好ましい方法です。ライブラリの場合、絶対パスを入力するのが好きです。そうしないと、ライブラリにリンクできなくなります。シンボリックリンクは$Originを、リンクtargetではなくlinkのパスを指すように変更します。

13
mattmilten

ここでの絶対パスと相対パスに関するUNIXの哲学は何ですか?

相対パスを使用すると、onlyが特定のディレクトリから呼び出されたときに機能する実行可能ファイルが作成されます。つまり、ほとんどありませんあなたが欲しいもの。例えば。実行可能ファイルが/app/foo/bin/exeにあり、DT_RUNPATHlib/にあり、依存ライブラリが/app/foo/lib/libfoo.soにある場合、exeはから呼び出された場合にのみ実行されます。 /app/foo、および他のディレクトリから呼び出されたときではありません。

絶対パスを使用する方がはるかに優れています。cd /tmp; /app/foo/bin/exeを実行しても、実行可能ファイルは引き続き機能します。ただし、これはまだ理想的とは言えません。バイナリの複数のバージョンを簡単に作成することはできず(開発時には重要です)、パッケージをインストールする必要があるエンドユーザーに指示します。

$Originをサポートするシステムでは、DT_RUNPATH$Origin/../libを使用すると、bin/への相対パスと、 lib/は保持されます。

13

rpathの場合、相対パスはバイナリ/ライブラリが見つかったディレクトリではなく、現在の作業ディレクトリからの相対パスであるため、相対パスを使用しても意味がありません。そのため、ほとんどの場合、$PATHにある実行可能ファイルやライブラリでは機能しません。

代わりに、$Origin "special"パスを使用して、実行可能ファイルに相対的なパスを指定できます。
-Wl,-rpath,'$Origin'-シェルが変数として解釈しないように、引用符で囲む必要があることに注意してください。Makefileでこれを実行しようとする場合は、回避するために$$が必要です。 makeに$も解釈させます。

18
Chris Dodd