如何从C++中获取可执行共享库列表?

5

我希望可以通过编程方式在Linux和Solaris中获取与我的二进制文件链接的共享库列表。目前,我使用pmap外壳程序(我不能使用ldd对二进制文件进行操作,因为它不会包括dlopen的库,也无法使用pldd,因为它只能在Solaris上使用):

std::ostringstream cmd;
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u";
FILE* p = popen(cmd.str().c_str(), "r");

这有点hackish,但它适用于Solaris和Linux(pmap输出略有不同,但所需信息始终在最后一列)。有没有一种方法可以在不使用shell的情况下获得相同的信息?这适用于两个平台吗?我假设/proc/$PID文件在它们之间格式不同,但我不知道通常位于哪个位置以帮助解析它们的标题(如果有共同的位置的话)。


严格来说,dlopen的库不是“链接”的,它们是在运行时加载的。我猜你实际上想要一个所有已加载共享库的列表? - Mark B
1个回答

2

您可以使用pmap 1234命令,其中1234是进程的ID。

从程序内部来看,更简单的方法(仅适用于Linux)是读取并解析/proc/self/maps文件。

在Linux下尝试运行

cat /proc/self/maps

它将显示运行上述cat命令的进程的内存映射。

如果您有一些精确的指针,可以使用dladdr(一个GNU/Linux或Glibc特定的函数)获取包含指针的动态库的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接