给定一个mach_header,我如何找到二进制图像的名称?

问题描述 投票:0回答:1

我正在研究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() 回调(使用任何必要的额外系统调用)如何确定图像名称?

ios objective-c cocoa dyld mach
1个回答
2
投票

答非所问 答案如下。

// 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() 上文中的调用,是参照 本回答]

© www.soinside.com 2019 - 2024. All rights reserved.