スクラップヒープ用にスケジュールされた古い実行可能ファイルがありますが、まだありません。私の環境から削除されたいくつかのライブラリに依存していますが、うまく動作する場所にスタブライブラリがいくつかあります。この実行可能ファイルをこれらのスタブライブラリに向けたいと思います。はい、LD_LIBRARY_PATHを設定できますが、この実行可能ファイルは多くのスクリプト、多くのユーザーから呼び出され、1つの場所で修正したいと思います。
私はこれのソースを持っていません、そしてそれを手に入れるのは難しいでしょう。私は考えていました-ELF対応エディターを使用してこのファイルを編集し、rpathに単純なPATHを追加して新しいライブラリにヒットさせることができますか?これは可能ですか?またはELFバイナリを作成したら、場所に物事を修正して移動できませんか?
これを行うことができるchrpath
というツールがあります-おそらくディストリビューションのパッケージで利用可能です。
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
うまくいく。
@ 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>
ノート:
RPATH
とRUNPATH
の両方を削除しますR [UN] PATHに値を追加
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
ノート:
<desired-path>
はコンマ区切りのディレクトリリストです。例:/my/libs:/my/other/libs
--force-rpath
を指定した場合、RPATH
を設定します。それ以外の場合、RUNPATH
を設定しますこれは私のために働き、XORIGINを$ Originに置き換えました。
chrpath -r '\$\Origin/../lib64' httpd