GNU/Linux >> Linux の 問題 >  >> Linux

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

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 を設定します

Linux
  1. RUNPATH ではなく RPATH を使用しますか?

  2. 私のブートローダーは gcc 4.6 と 4.7 でコンパイルできません ... 4.5 のみ

  3. Ubuntu 14.04 で php-cli のバージョンを変更するにはどうすればよいですか?

  1. コンソールで入力キーボード レイアウトを変更するにはどうすればよいですか?

  2. mprotect() を使用して .rodata の権限を変更できますか?

  3. Linux でユーザーのデフォルト グループを変更するにはどうすればよいですか?

  1. -static でコンパイルされたバイナリかどうかを確認する

  2. Linux で信頼できない実行可能ファイルを安全に実行するにはどうすればよいですか?

  3. VMware を実行する前に、いくつかのモジュールをコンパイルする必要があります