web-dev-qa-db-ja.com

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

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

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

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

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

63
Justicle
#include <stdio.h>
#include <elf.h>
#include <link.h>

int main()
{
  const ElfW(Dyn) *dyn = _DYNAMIC;
  const ElfW(Dyn) *rpath = NULL;
  const char *strtab = NULL;
  for (; dyn->d_tag != DT_NULL; ++dyn) {
    if (dyn->d_tag == DT_RPATH) {
      rpath = dyn;
    } else if (dyn->d_tag == DT_STRTAB) {
      strtab = (const char *)dyn->d_un.d_val;
    }
  }

  if (strtab != NULL && rpath != NULL) {
    printf("RPATH: %s\n", strtab + rpath->d_un.d_val);
  }
  return 0;
}
42

記録のために、rpathヘッダーを表示するコマンドがいくつかあります。

objdump -x binary-or-library |grep RPATH

それを行うより良い方法は次のとおりです。

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

2番目のコマンドは、rpathが後に続く他のライブラリへの直接の依存関係もリストします。

131
Michael Dillon

以下も使用できます。

chrpath -l binary-or-library
4

github.com/NixOS/patchelfのコードを使用できるかもしれませんが、知る限りライブラリATMではありません。

0
qknight