web-dev-qa-db-ja.com

コンパイル済みのバイナリの「rpath」を変更できますか?

スクラップヒープ用にスケジュールされた古い実行可能ファイルがありますが、まだありません。私の環境から削除されたいくつかのライブラリに依存していますが、うまく動作する場所にスタブライブラリがいくつかあります。この実行可能ファイルをこれらのスタブライブラリに向けたいと思います。はい、LD_LIBRARY_PATHを設定できますが、この実行可能ファイルは多くのスクリプト、多くのユーザーから呼び出され、1つの場所で修正したいと思います。

私はこれのソースを持っていません、そしてそれを手に入れるのは難しいでしょう。私は考えていました-ELF対応エディターを使用してこのファイルを編集し、rpathに単純なPATHを追加して新しいライブラリにヒットさせることができますか?これは可能ですか?またはELFバイナリを作成したら、場所に物事を修正して移動できませんか?

76
Rich Homolka

これを行うことができるchrpathというツールがあります-おそらくディストリビューションのパッケージで利用可能です。

66
TomH

chrpath と呼ばれるpatchelfよりも汎用的なツールがあります。元々は、NixおよびNixOS(パッケージングシステムおよびGNU/Linuxディストリビューション)用のパッケージを作成するために作成されました。

バイナリ(ここではrdsampと呼びます)にrpathがない場合、chrpathは失敗します:

chrpath -r '$Origin/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found.

一方、

patchelf --set-rpath '$Origin/../lib64' rdsamp

うまくいく。

134
user7610

@ user7610が言ったように、正しい方法はpatchelfツールです。

しかし、私はより包括的な答えを出すことができ、まさにそれを行うために必要なすべてのコマンドをカバーできると感じています。

主題に関する包括的な説明を読みたい場合は、より多くの情報を見つけることができます こちら

まず、多くの開発者がRPATHについて話しますが、実際にはRUNPATHを意味します。これらは2つの異なるオプションの動的セクションであり、ローダーはそれらを非常に異なる方法で処理します。前述のリンクで、それらの違いについて詳しく読むことができます。

今のところ、覚えておいてください:

  • RUNPATHが設定されている場合、RPATHは無視されます
  • RPATHは非推奨であり、避けるべきです
  • LD_LIBRARY_PATHで上書きできるため、RUNPATHが推奨されます

現在のR [UN] PATHを参照

readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"

R [UN] PATHをクリアします

patchelf --remove-rpath <path-to-elf>

ノート:

  • RPATHRUNPATHの両方を削除します

R [UN] PATHに値を追加

patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>

ノート:

  • <desired-path>はコンマ区切りのディレクトリリストです。例:/my/libs:/my/other/libs
  • --force-rpathを指定した場合、RPATHを設定します。それ以外の場合、RUNPATHを設定します
4
Daniel Trugman

これは私のために働き、XORIGINを$ Originに置き換えました。

chrpath -r '\$\Origin/../lib64' httpd

0
vikram kedlaya