1. 前言
上一节学习了 iOS强化 : 熟悉 Mach-O 文件, 对 Mach-O 有个大致的了解,今天来学习 Mach-O 可执行文件的生成过程 :编译与链接。
知识参考:
- iOS 底层探索:LLVM 入门
- iOS App 加载流程知识
2. Mach-O 文件生成过程
链接的本质 :就是把多个⽬标⽂件组合成⼀个⽂件(Mach-O可执行文件)
目标文件 :通常.o文件被我们称之为目标文件
▐ 2.1 目标文件的生成过程

大概步骤:
- 将代码汇编化
- 将符号进行归类;此时地址还没有虚拟化(没有生成虚拟内存地址)。对于外部导入符号,它的调用地址无法得知,需要将其放到重定位符号表中
- 生成一个或多个
.o目标文件 - 此时链接器(
llvm-ld)并没有被执⾏
▐ 2.2 目标文件的生成过程

- 多个目标文件合并
- 符号表(包括重定位符号表)合并成一张表
- 生成一个
Mach-O可执行文件
3. 静态链接
代码经过编译链接最后分配虚拟内存地址生成可执行文件或动态库

4. 动态链接
在运行时,由dyld动态加载
静态/动态链接

5. 总结
编译本质:将代码汇编化,并将符号进行归类。外部导入符号,放到重定位符号表。生成一个或多个.o目标文件链接本质:多个目标文件合并,符号表(包括重定位符号表)合并成一张表,生成一个Mach-O可执行文件


