【问题标题】:How to parse private Objective-C specific Mach-O sections如何解析私有 Objective-C 特定的 Mach-O 部分
【发布时间】:2012-08-10 15:14:08
【问题描述】:

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

引用PiOS paper

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

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

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

__objc_classref__objc_classlist 部分的实际结构是什么?

提前致谢。

【问题讨论】:

    标签: objective-c mach-o


    【解决方案1】:

    查看slightly newer version of the Objective-C runtime implementationGETSECT 宏的定义。看起来是这样的:

    #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。解释这些字段应该是相对不言自明的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2020-08-01
      • 2020-09-23
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多