【问题标题】:How to get executable shared library list from C++?如何从 C++ 获取可执行的共享库列表?
【发布时间】:2011-12-15 01:32:26
【问题描述】:

我想以编程方式获取由我的二进制文件在 Linux 和 Solaris 上链接的共享库的列表。现在我开始使用 pmap(我不能在二进制文件上使用 ldd,因为它不包含 dlopen'd 库,我不能使用 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");

这有点骇人听闻,但它适用于 Solaris 和 Linux(pmap 输出略有不同,但所需的信息始终在最后一列)。有没有办法在不掏空的情况下获得相同的信息?这在两个平台上都有效吗?我假设/proc/$PID 文件之间的格式不同,但我不知道帮助解析这些文件的标头通常位于何处(如果有共同的位置?)。

【问题讨论】:

  • 严格来说dlopened 库不是“链接”的,它们是在运行时加载的。我假设您实际上想要所有已加载共享库的列表?

标签: c++ posix shared-libraries ld procfs


【解决方案1】:

您可以使用pmap 1234 命令并将1234 作为进程ID。

在您的程序内部,更简单的方法(特定于 Linux)是读取和解析 /proc/self/maps 文件。

尝试运行

cat /proc/self/maps

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多