OC高级强化02:Mach-O与链接器

张建 lol

Mach-O 是什么?

Mach-O(Mach Object)是 macOS、iOS、iPadOS 用来 存储程序和库文件格式
对应系统通过应用 二进制接口(application binary interface,缩写 ABI)来运行该格式的文件。

Mach-O格式用来替代BSD系统的a.out格式。Mach-O文件格式 保存 了在 编译过程链接过程 中产生的 机器代码和数据,从而为 静态链接和动态链接 的代码提供了单一文件格式。

我习惯将 Mach-O = 配置文件 + 二进制代码

Mach-O文件格式如下:

IMG_2076

  • 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 中,它的排列是按照一定规则的。

编译和链接

  1. 什么是 编译

答:实际上,编译 的过程就是去把写在文件(.h/.m等)中的 代码 放到对应的 Mach-O的配置中。

  1. 什么是 链接

答:当我 编译 可执行文件的时候,中间要经过一个目标文件 .o 文件,链接的本质就是把多个目标文件组合成一个文件的过程

在代码 编译 中,我们会生成多个.o目标文件,最后要生成一个可执行文件,而链接就是把多个.o的目标文件符号表合 并成一起,最终生成一个可执行文件的过程。

符号表 Symbol Table

Symbol Table:就是用来保存符号

String Table:就是用来保存符号的名称

Indirect Symbol Table:间接符号表,保存使用的外部符号,更准确一点就是使用的外部动态库的符号,是Symbol Table的子集。

如何让Xcode编译的命令显示到终端上

  • 首先打开终端 command + t 新建一个窗口,输入 tty,会输出一个像链接一样的东西,这个链接的意思就是你可以把其他地方的输出定位到这个地方
1
2
3
Last login: Thu Jan  6 10:21:55 on ttys001
zhangjian@zhangjiandeMacBook-Pro ~ % tty
/dev/ttys005
  • 然后在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+脚本记录,暂时列出几个知识点:

  1. 项目瘦身的顺序:
  • -O1 -Oz 生成目标文件 (编译)
  • dead code strip 使代码剥离 (链接)
  • strip 剥离符号(mach-o)
  1. $SRCROOT 代码的路径

  2. -p:不排序

  3. -a:显示所有符号,包含调式符号

  4. 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.