我正在研究Mach动态链接器dyld
。这个问题适用于所有Apple平台,但很高兴针对特定平台提供答案。我正在使用ObjC,但也很高兴为您翻译Swift。 The relevant Apple docs can be found here。
我正在尝试解决我维护的库中的死锁问题,因此需要捕获有关已加载的二进制映像的信息。 (对于初学者,这些不是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;
// ...
}
The docs声明
dladdr()
函数仅在动态链接的程序中可用。我希望在其中使用的框架也作为静态库存在。我正尽我所能,所以想再次检查一下我是否正确误解了动态链接,并且在所有现代Mac,iOS等应用程序中使用dladdr()
都可以。[编辑:上面的
dladdr()
调用已参考this answer进行了修复]