有没有办法检查或访问 C++ 二进制文件本身动态链接到的库的名称?
本质上我想在二进制文件上运行ldd
,而不运行ldd
。
用例是使用 dlfcn.h
中的 dlopen
。我有一个链接到 libpython
的 C++ 库,但我不知道它是否是 libpython3.5m.so
、libpython3.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/