我正在研究Mach动态链接器。dyld
. 这个问题适用于所有的苹果平台,但很高兴能得到一个特定平台的答案;我使用ObjC,但也很高兴翻译Swift,如果这对你有用的话。 相关的苹果文档可以在这里找到.
我正试图解决我维护的一个库中的死锁问题,因此需要捕获加载的二进制图像的信息。(对于不熟悉的人来说,这些不是JPEG的那种图像)。
我已经注册了一个回调,以观察二进制图像的添加,通过 _dyld_register_func_for_add_image()
而这是在图像加载时被调用的。 我可以看到 mach_header
结构,以及传入的 vmaddr_slide
值。
出于各种避免死锁的原因,我不想使用 _dyld_image_count()
_dyld_get_image_header()
后,而是想在图片加载时跟踪它们,只使用 add()
remove()
回调。 通常情况下,我可以调用 _dyld_get_image_name(index)
来检索图像名称,因为我对图像进行了迭代,但是,就像我说的,我不能使用迭代模型。
我的问题是:根据传入给 func_for_add_image()
回调(使用任何必要的额外系统调用)如何确定图像名称?
安 答非所问 的 答案如下。
// Required header:
#include <dlfcn.h>
// This is the callback, added via _dyld_register_func_for_add_image()
void add_binary_image(const struct mach_header *header, intptr_t slide)
{
// ...
Dl_info DlInfo;
dladdr(header, &DlInfo);
const char* image_name = DlInfo.dli_fname;
// ...
}
文件 说明 dladdr()
函数只能在动态链接的程序中使用。 我希望使用的框架也是以静态库的形式存在。 我的知识已经到了极限,所以想仔细检查一下我对动态链接的理解是否正确,以及使用 dladdr()
在现代Mac、iOS等所有应用中都会OK。
编辑:该 dladdr()
上文中的调用,是参照 本回答]