我知道可以使用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.
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)
为了方便起见,我将其用作 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。