个人原创,转帖请注明来源:
之前两篇帖子分别讲了mach-o的header区和load command区中的segment,今天继续讲segment中的的setcion,一般在__TEXT和__DATA段中有section。这里注意下命名规范,大写代表segment,小写是section,例如 __TEXT.__text,指的是__TEXT段的__text节。
先看section结构定义:
再看hopper中的__TEXT.__text 描述:
根据结构定义依次分析:
1.sectname 例子中是__text ,就是主程序代码
2.segname 该section所属的 segment名,例子中是__TEXT
3.addr 该section在内存的启始位置,例子中值是0xb268,跳转到该位置看下,hopper的注释也非常好,看下图:
4.size 该section的大小
5.offset 该section的文件偏移,根据例子中上下文,文件开始于0x4000位置,offset大小是0x7268,这样就得出绝对位置是0x4000+0x7268,和之前addr的值是一样。
6.align 字节大小对齐
7. reloff 重定位入口的文件偏移
8.nreloc 需要重定位的入口数量
9.flags 包含section的type和attributes,具体看loader.h。
结构中的最后2项保留用。
以下是__TEXT段的section
__text 主程序代码
__stubs 和__stub_helper 用于动态链接库的stub
__cstring c语言字符串
__const const修饰的常量
__objc_methname objc的方法名称
__objc_methtype objc方法类型
__objc_classname objc类方法
以下是__DATA段的section
__objc_ivars objc类的实例变量
__objc_classlist objc类列表
__objc_protolist objc协议列表
__objc_imageinfo objc镜像信息
__objc_const objc常量
__objc_selfrefs objc自引用(self)
__objc_protorefs objc协议引用
__objc_superrefs objc超类引用
__cfstring 使用Core Foundation字符串
__bss BSS
至此,一共3篇“看懂mach-o” ,让我们了解mach-o的布局,最后看下hopper中分析出来的segment和section列表。