99

我知道可以readelf -d <elf> | grep RPATH从 shell 中检查给定的二进制文件,但是可以在进程中执行此操作吗?

像(我完全编造的系统调用):

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

我正在尝试在我们的代码库中诊断一些可疑的 SO 链接问题,并希望尽可能以这种方式检查 RPATH(我宁愿不必生成外部脚本)。

4

5 回答 5

170

作为记录,这里有几个将显示rpath标题的命令。

objdump -x binary-or-library |grep RPATH

也许更好的方法是:

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

第二个命令还列出了对其他库的直接依赖关系,后跟rpath.

于 2011-06-14T18:39:35.363 回答
61
#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;
}
于 2010-05-17T04:52:15.243 回答
16

您还可以使用:

chrpath -l binary-or-library
于 2018-08-02T12:28:57.757 回答
1

为方便起见,我将其用作 shell 函数:

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

它也应该适用于 binutilsreadelf而不是 elfutils eu-readelf

于 2020-07-30T03:27:03.520 回答
-1

有一种方法。遵循man dlinfo[1] 中的示例代码,但将NULL其用作 的第一个参数dlopen()

[1] https://man7.org/linux/man-pages/man3/dlinfo.3.html

于 2021-06-25T02:42:51.043 回答