在Mach-O二进制文件的数据段中,有几个特定于目标C的部分(在Mach-O文件格式的第7页中提到)
引用PiOS纸
__objc_classlist部分包含了其实现存在于分析的二进制文件中的所有类的列表(即由开发人员实现的所有类或由静态链接器包含的类)。
和
另一方面,__objc_classref部分包含对应用程序使用的所有类的引用。这些类的实现不需要包含在二进制本身中,而是可以由运行时框架(相当于动态链接库)提供。
他们提到,这些结构的布局可以从目标C运行时头(它们是可用的这里)获得。
__objc_classref和__objc_classlist部分的实际结构是什么?
提前谢谢。
发布于 2013-03-23 06:51:39
看看GETSECT宏在略有更新的Objective运行时实现版本中的定义。看起来是这样的:
#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,解释这些字段应该相对来说是不言自明的。
https://stackoverflow.com/questions/11904570
复制相似问题