Linuxで現在のrpathを検査する方法はありますか?


83

readelf -d <elf> | grep RPATHシェルから特定のバイナリを検査するために使用できることは知っていますが、プロセス内でこれを行うことは可能ですか?

(私の完全に構成されたシステムコール)のようなもの:

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

コードベースでSOリンクの疑いのある問題を診断しようとしていますが、可能であればこの方法でRPATHを検査したいと思います(外部スクリプトを生成する必要はありません)。


1
共有ライブラリの問題を診断するときは、RUNPATHタグも検査する必要があることに注意してください。したがって、grep PATH代わりにすべきです。それはRPATHまたはRUNPATHが使用されているかどうかをリンカまでだ、と2の間に微妙だが、重要な違いがあります:stackoverflow.com/a/52020177
ニコラスCapens

回答:


54

1
素晴らしいですが、$ ORIGINでは機能しません。$ ORIGINは解釈されず、関数によってそのまま返されます。$ ORIGIN解釈を追加する方法はありますか?
ジェローム

5
@Jérôme/procがマウントされている環境で実行している場合、展開$ORIGINreadlink("/proc/self/exe", ...)NULと同じくらい簡単です-最後のスラッシュで終了します。
ロシア語を採用2014

質問は特にについてでしたが、バイナリが共有ライブラリをロードする可能性のあるパスを知りたい場合RPATHは、DT_RUNPATHタグをチェックすることも同様に重要であることに注意してください。
NicolasCapens20年

155

念のため、rpathヘッダーを表示するコマンドをいくつか示します。

objdump -x binary-or-library |grep RPATH

たぶんそれを行うためのさらに良い方法は次のとおりです:

readelf -d binary-or-library |head -20

2番目のコマンドは、他のライブラリへの直接の依存関係も一覧表示し、その後にrpath。が続きます。


7
ubuntu 15.04では、次を使用する必要があります:objdump -x binary-or-library | grep RUNPATH
Andreas Roth


11
この回答は、尋ねられた質問とは何の関係もありません(そして質問自体に含まれています)。
2018


1

シェル関数として、便宜上使用するものは次のとおりです。

function getrpath {
    eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}

これはeu-readelf、次のelfutilsような出力を消費します。

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....

と放出

 /some/path/to/lib

readelfelfutilsではなくbinutilsでも問題なく動作するはずeu-readelfです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.