在运行时检查 C++ 共享依赖项(ldd on self)
Check C++ shared dependencies at runtime (ldd on self)
有没有办法检查或访问 C++ 二进制文件在二进制文件本身内动态链接到的库的名称?
本质上我想 运行 ldd
在二进制文件上,没有 运行ning 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 的路径。
有什么办法吗?
在 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 将使查找库变得更加容易。
有没有办法检查或访问 C++ 二进制文件在二进制文件本身内动态链接到的库的名称?
本质上我想 运行 ldd
在二进制文件上,没有 运行ning 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 的路径。
有什么办法吗?
在 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 将使查找库变得更加容易。