我们用 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

    Mach-O可执行文件 - 图1