我知道可以readelf -d <elf> | grep RPATH
从 shell 中检查给定的二进制文件,但是可以在进程中执行此操作吗?
像(我完全编造的系统调用):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
我正在尝试在我们的代码库中诊断一些可疑的 SO 链接问题,并希望尽可能以这种方式检查 RPATH(我宁愿不必生成外部脚本)。
作为记录,这里有几个将显示rpath
标题的命令。
objdump -x binary-or-library |grep RPATH
也许更好的方法是:
readelf -d binary-or-library |head -20
第二个命令还列出了对其他库的直接依赖关系,后跟rpath
.
#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;
}
您还可以使用:
chrpath -l binary-or-library
为方便起见,我将其用作 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
。
有一种方法。遵循man dlinfo
[1] 中的示例代码,但将NULL
其用作 的第一个参数dlopen()
。