有没有办法检查Linux上的当前rpath?

Jus*_*cle 68 linux rpath

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

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

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*lon 134

为了记录,这里有几个命令将显示rpath标题.

objdump -x binary-or-library |grep RPATH
Run Code Online (Sandbox Code Playgroud)

也许更好的方法是:

readelf -d binary-or-library |head -20
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案与被问到的问题没有任何关系*(在问题本身中*包含*). (9认同)
  • 在ubuntu 15.04上我必须使用:objdump -x binary-or-library | grep RUNPATH (5认同)
  • RPATH!= RUNPATH,请参阅http://stackoverflow.com/questions/7967848/use-rpath-but-not-runpath和http://blog.qt.io/blog/2011/10/28/rpath-and-运行路径/ (2认同)
  • @AndreasRoth 现在修正了答案以显示“RPATH”和“RUNPATH”。最好设置后者,因为它的优先级低于环境。变量“LD_LIBRARY_PATH”,为用户提供更大的灵活性。 (2认同)

Emp*_*ian 46

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Jérôme如果你在一个挂载`/ proc`的环境中执行,那么扩展`$ ORIGIN`就像`readlink("/ proc/self/exe",...)`然后NUL-terminate at the最后的斜线. (3认同)
  • 它很棒,但它不适用于 $ORIGIN。$ORIGIN 不被解释,并由函数按原样返回。有没有办法添加 $ORIGIN 解释? (2认同)

Osc*_*son 5

您还可以使用:

chrpath -l binary-or-library
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 5

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

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

这消耗了类似eu-readelf的输出elfutils

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....
Run Code Online (Sandbox Code Playgroud)

并发出

 /some/path/to/lib
Run Code Online (Sandbox Code Playgroud)

readelf它应该可以与 binutils而不是 elfutils一起正常工作eu-readelf