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
問題なく成功します。
chrpath
というツールがあります これを行うことができます - おそらくあなたのディストリビューションのパッケージで利用可能です.
@ user7610 が言ったように、正しい方法は patchelf
です
しかし、まさにそれを行うために必要なすべてのコマンドをカバーする、より包括的な答えを提供できると思います.
この件に関する包括的な記事については、ここをクリックしてください
まず第一に、多くの開発者は RPATH
について話します。 、しかし実際には RUNPATH
を意味します .これらは 2 つの異なるオプションの動的セクションであり、ローダーはそれらを非常に異なる方法で処理します。それらの違いについては、前に述べたリンクで詳しく読むことができます。
今のところ、覚えておいてください:
- If
RUNPATH
設定されています、RPATH
無視されます RPATH
は推奨されておらず、避ける必要がありますRUNPATH
LD_LIBRARY_PATH
でオーバーライドできるため、優先されます
現在の 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
を設定します