OC高级强化02:Mach-O与链接器
Mach-O 是什么?
Mach-O(Mach Object)是 macOS、iOS、iPadOS 用来 存储程序和库
的 文件格式
。
对应系统通过应用 二进制接口(application binary interface,缩写 ABI
)来运行该格式的文件。
Mach-O格式用来替代BSD系统的a.out格式。Mach-O文件格式 保存
了在 编译过程
和 链接过程
中产生的 机器代码和数据
,从而为 静态链接和动态链接
的代码提供了单一文件格式。
我习惯将 Mach-O = 配置文件 + 二进制代码
Mach-O文件格式如下:
- Mach-O 是可读可写的,
- Mach-O + 签名 苹果就认你这个Mach-O
- Mach-O __TEXT 代码段 只读
- Mach-O __DATA 数据段
点击Xcode运行按钮的时候,系统做了哪些事情?
首先,加载ipa包里可执行文件
Product
-> LoginApp
-> show in finder
-> 右键显示包内容,找到 LoginApp可执行文件
可执行文件的调用过程:
1)调用 fork
函数,创建一个 process
进程
2)调用 execve
或其衍生函数,在该进程上加载,执行我们的 Mach-O
文件,当我们调用 execve
(应用程序加载器),内核实际上在执行以下操作:
- 将文件加载到内存
- 开始分析
Mach-O
中的mach_header
,已确认它是有效的Mach-O
文件
Mach-O 中是不是都是二进制?
答:Mach-O
中就是二进制
Mach-O 是不是可读可写的?
答:Mach-O
是 可读可写
的 二进制文件
程序的入口为什么一定是 main ?
答:Mach-O
中默认指定了程序的入口必须是 main
,我们写的代码最终会转成 二进制
,最后落在 Mach-O
中,它的排列是按照一定规则的。
编译和链接
- 什么是
编译
?
答:实际上,编译
的过程就是去把写在文件(.h/.m等)中的 代码
放到对应的 Mach-O的配置
中。
- 什么是
链接
?
答:当我 编译
可执行文件的时候,中间要经过一个目标文件 .o
文件,链接
的本质就是把多个目标文件组合成一个文件的过程
在代码 编译
中,我们会生成多个.o目标文件,最后要生成一个可执行文件,而链接
就是把多个.o的目标文件符号表合
并成一起,最终生成一个可执行文件的过程。
符号表 Symbol Table
Symbol Table:就是用来保存符号
String Table:就是用来保存符号的名称
Indirect Symbol Table:间接符号表,保存使用的外部符号,更准确一点就是使用的外部动态库
的符号,是Symbol Table的子集。
如何让Xcode编译的命令显示到终端上
- 首先打开终端
command + t
新建一个窗口,输入tty
,会输出一个像链接一样的东西,这个链接的意思就是你可以把其他地方的输出定位到这个地方
1 | Last login: Thu Jan 6 10:21:55 on ttys001 |
- 然后在XCode中,LoginApp -> Build Phases -> 点击+号 -> 添加 Run Script 执行脚本,添加如下内容,让输出的内容
重定向
显示到终端上
1 | echo "ZJ_Cat" > /dev/ttys005 |
- 点击运行按钮,你会在终端上打印
ZJ_Cat
内容
- 我们知道在
xxconfig
定义的变量可以在项目中获取, 同样的也可以被运行脚本的Run Script
所获取
1 | echo "${HOST_URL}" > /dev/ttys005 |
由此可见,我们可以通过 脚本+xxconfig
来实现查看 可执行文件
的输出的 符号表
这里我先不做xxconfig+脚本记录,暂时列出几个知识点:
- 项目瘦身的顺序:
- -O1 -Oz 生成目标文件 (编译)
- dead code strip 使代码剥离 (链接)
- strip 剥离符号(mach-o)
$SRCROOT 代码的路径
-p:不排序
-a:显示所有符号,包含调式符号
nm -pa 可执行文件路径 : 查看可执行文件的符号表
- Post title:OC高级强化02:Mach-O与链接器
- Post author:张建
- Create time:2022-01-05 17:28:20
- Post link:https://redefine.ohevan.com/2022/01/05/OC底层原理/OC高级强化02:Mach-O与链接器/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.