我正在研究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进行了修复]

10-06 04:47