有没有办法在Linux上检查当前的rpath?
我知道可以使用有没有办法在Linux上检查当前的rpath?,linux,rpath,Linux,Rpath,我知道可以使用readelf-d | grep RPATH从shell检查给定的二进制文件,但是否可以在一个进程内执行此操作 类似(我完全虚构的系统调用): 我正在尝试诊断代码库中的一些可疑SO链接问题,如果可能的话,我希望以这种方式检查RPATH(我不希望生成外部脚本)。\include #包括 #包括 int main() { 常数ElfW(Dyn)*Dyn=\u动态; 常量ElfW(Dyn)*rpath=NULL; 常量字符*strtab=NULL; 对于(;dyn->d_标记!=DT_N
readelf-d | grep RPATH
从shell检查给定的二进制文件,但是否可以在一个进程内执行此操作
类似(我完全虚构的系统调用):
我正在尝试诊断代码库中的一些可疑SO链接问题,如果可能的话,我希望以这种方式检查RPATH(我不希望生成外部脚本)。\include
#包括
#包括
int main()
{
常数ElfW(Dyn)*Dyn=\u动态;
常量ElfW(Dyn)*rpath=NULL;
常量字符*strtab=NULL;
对于(;dyn->d_标记!=DT_NULL;++dyn){
if(dyn->d_标记==DT_路径){
rpath=dyn;
}else if(dyn->d_标记==DT_STRTAB){
strtab=(const char*)dyn->d_un.d_val;
}
}
if(strtab!=NULL&&rpath!=NULL){
printf(“路径:%s\n”,strtab+RPATH->d_un.d_val);
}
返回0;
}
对于记录,这里有几个命令将显示rpath
标题
objdump -x binary-or-library |grep RPATH
也许更好的方法是:
readelf -d binary-or-library |head -20
第二个命令还列出了对其他库的直接依赖关系,后跟rpath
,您还可以使用:
chrpath -l binary-or-library
以下是我为方便起见使用的shell函数:
function getrpath {
eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}
这将消耗来自elfutils
的eu readelf
输出,如:
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
它应该可以与binutils
readelf
配合使用,而不是与elfutilseu readelf
配合使用。它非常出色,但与$ORIGIN不配合使用$ORIGIN不会被解释,而是由函数按原样返回。有没有办法添加$ORIGIN解释?@Jérôme如果您在安装了/proc
的环境中执行,那么扩展$ORIGIN
就像readlink(“/proc/self/exe”,…)
一样简单,然后NUL在最后一个斜杠处终止。而问题具体是关于RPATH
,我想指出的是,如果想知道二进制文件加载共享库的路径,检查DT\u RUNPATH
标签同样重要。在ubuntu 15.04上,我必须使用:objdump-x binary或library | grep RUNPATHRPATH!=RUNPATH,请参阅&此答案与所问的问题(并包含在问题本身中)无关。请记住,在诊断共享库问题时,还应检查RUNPATH标记。因此,您应该改为grep PATH
。使用RPATH还是RUNPATH取决于链接器,两者之间有细微但重要的区别:在ubuntu上:apt get install-y chrpath
/some/path/to/lib