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

标签 c++ c shared-libraries dlopen ldd

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

本质上我想在二进制文件上运行ldd,而不运行ldd

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

我要打电话

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

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

有什么办法可以做到这一点吗?

最佳答案

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

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

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

要回答您最初的“我链接到哪个版本的 libpython”问题,在基于 GLIBC 的系统上您可以使用 dl_iterate_phdr枚举所有当前加载的共享库。

如果您已经有一个已知在 libpython 中定义的符号,dladdr1将使查找图书馆变得更加容易。

关于c++ - 在运行时检查 C++ 共享依赖项(ldd on self),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317750/

相关文章:

c++ - 在 C++ 中对字符串使用复制构造函数和/或赋值运算符时发生堆栈溢出

c - 如何计算C中每个进程的平均CPU使用率

android - 异常更新游戏到cocos2d-x v2.0

c++ - 重新定义 C++

c++ - constexpr 和函数体 = 删除 : what's the purpose?

c++ - 文件是否在另一个应用程序中打开?

c - 同时访问文件。奇怪的锁定行为

c - 为什么静态变量不执行 ‘add’指令?

linux - 如何确定 libpthread 和 libthread_db 是否匹配?

c++ - Linux,共享库使用主程序中的函数而不是其他共享库