在运行时检查 C++ 共享依赖项(ldd on self)

Check C++ shared dependencies at runtime (ldd on self)

有没有办法检查或访问 C++ 二进制文件在二进制文件本身内动态链接到的库的名称?

本质上我想 运行 ldd 在二进制文件上,没有 运行ning ldd

用例正在使用 dlfcn.h 中的 dlopen。我有一个链接到 libpython 的 C++ 库,但我不知道它是否是 libpython3.5m.solibpython3.4m.solibpython2.7.so 等...

我要打电话

void* handle = dlopen( "@PYTHON_LIBRARY@", RTLD_LAZY | RTLD_GLOBAL );

其中 "@PYTHON_LIBRARY@" 解析为模块当前动态链接到的任何当前 libpython 的路径。

有什么办法吗?

在 Linux 上,您可以阅读 /proc/self/maps/proc/self/map_files,但这不能移植到其他平台。

I want to call void *handle = dlopen("...", ...)

大概你想调用 dlsym(handle, "SomePythonSymbol").

这是一件毫无意义的事情。无需执行动态查找,只需直接调用 SomePythonSymbol

要回答您原来的 "what version of libpython am I linked to" 问题,在基于 GLIBC 的系统上,您可以使用 dl_iterate_phdr 枚举所有当前加载的共享库。

如果您已经知道在 libpython 中定义了一个符号,dladdr1 将使查找库变得更加容易。