有没有一种编程方法可以检查 Linux 上当前的 rpath?
我知道可以使用 readelf -d elf> | grep RPATH 从 shell 检查给定的二进制文件,但是是否可以在进程中执行此操作?
就像(我完全编造的系统调用):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
我正在尝试诊断我们的代码库中的一些可疑的SO链接问题,并且希望如果可能的话以这种方式检查RPATH(我宁愿不必生成外部脚本) 。
I'm aware that it is possible to use readelf -d <elf> | grep RPATH
to inspect a given binary from the shell, but is it possible to do this within a process?
Something like (my completely made up system call):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
I'm trying to diagnose some suspect SO linking issues in our codebase, and would like to inspect the RPATH this way if possible (I'd rather not have to spawn an external script).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
作为记录,这里有几个命令将显示
rpath
/runpath
标头。也许更好的方法如下:
第二个命令还列出了对其他库的直接依赖项,后跟 rpath。
For the record, here are a couple of commands that will show the
rpath
/runpath
header.Maybe an even better way to do it is the following:
The second command also lists the direct dependencies on other libraries followed by
rpath
.这个问题具体是关于 RPATH 的,但现代链接器使用 RUNPATH 代替。请参阅此答案 - 两者之间存在细微的语义差异。
答案已更新为打印。
The question is specifically about
RPATH
, but modern linkers useRUNPATH
instead. See this answer -- there is a subtle semantic difference between the two.The answer is updated to print either.
您还可以使用:
You can also use:
为了方便起见,我将其用作 shell 函数:
这会消耗来自
elfutils
的eu-readelf
输出,例如:并发出
它应该与 binutils
readelf
一起正常工作code> 也代替 elfutilseu-readelf
。Here's what I use for convenience, as a shell function:
This consumes
eu-readelf
output fromelfutils
like:and emits
It should work fine with binutils
readelf
instead of elfutilseu-readelf
too.如果你有 patchelf 它也可以以漂亮的格式打印 rpath:
If you have patchelf it can also print rpath in a pretty format:
有一个办法。遵循
man dlinfo
[1] 中的示例代码,但使用NULL
作为dlopen()
的第一个参数。[1] https://man7.org/linux/man-pages /man3/dlinfo.3.html
There is a way. Follow the example code in
man dlinfo
[1], but useNULL
as the first parameter ofdlopen()
.[1] https://man7.org/linux/man-pages/man3/dlinfo.3.html