1

在 Mach-O 二进制文件的 DATA 段中,有一些特定于 Objective-C 的部分(在Mach-O 文件格式的第 7 页提到)

引用PiOS 论文

__objc_classlist 部分包含所有类的列表,其实现存在于分析的二进制文件中(即,开发人员实现或静态链接器包含的所有类)

另一方面,__objc_classref 部分包含对应用程序使用的所有类的引用。这些类的实现不需要包含在二进制文件本身中,但可以由运行时框架(相当于动态链接库)提供。

他们提到这些结构的布局可从 Objective C 运行时标头(可在此处获得)中获得。

__objc_classref和部分的实际结构是__objc_classlist什么?

提前致谢。

4

1 回答 1

3

看看稍新版本的 Objective-C 运行时实现GETSECT中的宏定义。它看起来像这样:

#define GETSECT(name, type, sectname)                                   \
    type *name(const header_info *hi, size_t *outCount)  \
    {                                                                   \
        unsigned long byteCount = 0;                                    \
        type *data = (type *)                                           \
            getsectiondata(hi->mhdr, SEG_DATA, sectname, &byteCount);   \
        *outCount = byteCount / sizeof(type);                           \
        return data;                                                    \
    }

这告诉我们每个部分都是类型为的项目数组type

几行之后使用它来声明名为的函数_getObjc2ClassRefs,并_getObjc2ClassList读取您感兴趣的两个部分:

GETSECT(_getObjc2ClassRefs,           class_t *,       "__objc_classrefs");
GETSECT(_getObjc2ClassList,           classref_t,       "__objc_classlist");

所以__objc_classrefs包含class_t *s,并且__objc_classlist包含classref_ts。解释这些字段应该是相对不言自明的。

于 2013-03-23T06:51:39.113 回答