我已经编写了一个dlopen()库,我想将它传递给我的句柄倒转到共享库的完整路径名。在Linux上和我的朋友们,我知道我可以使用dlinfo()获取链接映射并遍历这些结构,但我似乎在OSX上找不到类似的东西。我能做的最接近的事情是:
dyld_image_count()和dyld_get_image_name(),迭代当前打开的所有库,并希望我能够猜出哪一个对应于我的句柄dladdr()。如果我对刚刚打开的库中的符号名有先验的了解,我可以使用dlsym(),然后使用dladdr()。效果很好。但是在一般情况下,我不知道这个共享库中有什么,我需要能够枚举符号才能做到这一点,我也不知道该如何做。
因此,任何关于如何从它的dlopen句柄查找库的路径名的提示都是非常感谢的。谢谢!
发布于 2015-05-17 23:58:12
经过大约一年的使用,我们发现了另一种方法,该方法更简单,避免了一种(相当罕见)的失败模式;具体来说,因为0xset的代码片段遍历当前加载的每个dylib,找到第一个导出的符号,尝试在当前正在寻找的dylib中解析它,如果在特定的dylib中找到该符号,则如果从任意库中导出的第一个符号恰好存在于当前正在搜索的dylib中,则可能会出现假阳性。
我的解决方案是使用_dyld_get_image_name(i)获取每个加载的图像的绝对路径,dlopen()该图像,并比较句柄(在屏蔽了dlopen()由于使用RTLD_FIRST之类的东西而设置的任何模式位之后),以确保这个dylib实际上是传递给我函数的句柄的文件。
作为朱莉娅语言一部分的完整函数在这里可以看到,其相关部分复制如下:
// Iterate through all images currently in memory
for (int32_t i = _dyld_image_count(); i >= 0 ; i--) {
// dlopen() each image, check handle
const char *image_name = _dyld_get_image_name(i);
uv_lib_t *probe_lib = jl_load_dynamic_library(image_name, JL_RTLD_DEFAULT);
void *probe_handle = probe_lib->handle;
uv_dlclose(probe_lib);
// If the handle is the same as what was passed in (modulo mode bits), return this image name
if (((intptr_t)handle & (-4)) == ((intptr_t)probe_handle & (-4)))
return image_name;
}注意,像jl_load_dynamic_library()这样的函数是dlopen()的包装器,返回libuv类型,但是代码的精神保持不变。
https://stackoverflow.com/questions/20481058
复制相似问题