生成Mach-O
可执行文件,中间会经过目标文件,即.o
文件
⽣成
.o
目标文件的过程:
- 将代码汇编化
- 将符号进行归类;此时地址还没有虚拟化(没有生成虚拟内存地址)。对于外部导入符号,它的调用地址无法得知,需要将其放到重定位符号表中
- 生成一个或多个
.o
目标文件- 此时链接器(
llvm-ld
)并没有被执⾏外部导入符号存储的是
.m
/.o
文件中用到的API
。例如:NSLog
⽣成
Mach-O
可执行文件的过程:
- 多个目标文件合并
- 符号表(包括重定位符号表)合并成一张表
- 生成一个
Mach-O
可执行文件静态链接:
- 代码经过编译链接最后分配虚拟内存地址生成可执行文件或动态库
动态链接:
- 在运行时,由
dyld
动态加载
静态/动态
链接
总结
- 编译本质:将代码汇编化,并将符号进行归类。外部导入符号,放到重定位符号表。生成一个或多个
.o
目标文件- 链接本质:多个目标文件合并,符号表(包括重定位符号表)合并成一张表,生成一个
Mach-O
可执行文件