我们用 Xcode 构建一个程序的过程中,会把源文件 (.m
和 .h
) 文件转换为一个可执行文件。这个可执行文件中包含的字节码会将被 CPU (iOS 设备中的 ARM 处理器或 Mac 上的 Intel 处理器) 执行。这个可执行文件就是Mach-O可执行文件。
将.m和.h文件转化为Mach-O这个过程,编译器需要进行以下处理:
1、预处理
- 符号化 (Tokenization)
- 宏定义的展开
#include
的展开
2、语法和语义分析
- 将符号化后的内容转化为一棵解析树 (parse tree)
- 解析树做语义分析
- 输出一棵抽象语法树(Abstract Syntax Tree* (AST))
3、生成代码和优化
- 将 AST 转换为更低级的中间码 (LLVM IR)
- 对生成的中间码做优化
- 生成特定目标代码
- 输出汇编代码
4、汇编器
- 将汇编代码转换为目标对象文件。
5、链接器
- 将多个目标对象文件合并为一个可执行文件 (或者一个动态库)
Mach-O可执行文件的结构:
- Header——描述了文件的大概信息
- Load Commands——描述了 Data 在二进制文件和虚拟内存中的布局信息
- Data —-存储了实际的内容,主要是程序的指令和数据,它们的排布完全依照 Load Commands 的描述。
- Segment
- __PAGEZERO
- __TEXT
- __DATA_CONST
- __DATA
- __LINKEDIT
- Section
- Segment