Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Linux上检查当前的rpath?_Linux_Rpath - Fatal编程技术网

有没有办法在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
配合使用,而不是与elfutils
eu 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