什么是Mach-O?
Mach-O(Mach Object)是macOS、iOS、iPadOS存储程序和库的文件格式。对应系统通过应用二进制接口(application binary interface,缩写为ABI)来运行该格式的文件。
Mach-O格式作为BSD系统的a.out格式的替代,它提供了更强的扩展性,并提升了符号表中信息的访问速度。Mach-O文件格式保存在编译过程和链接过程中产生的机器代码和数据,从而为静态链接及动态链接的代码提供单一文件格式。
可执行文件调用过程:
- 调用
fork
函数,创建一个process
- 调用
execve
或其衍生函数,在该进程上加载,执行Mach-O
文件
当我们调用execve
,内核实际上在执行以下操作: - 将文件加载到内存
- 开始分析
Mach-O
中的mach_header
,以确保它是有效的Mach-O
文件
打开终端输入
$ objdump --macho --private-headers /Users/bepa/Library/Developer/Xcode/DerivedData/LoginApp-dmjlwlualsxjekeluddaletddbxm/Build/Products/Debug-iphonesimulator/LoginApp.app/LoginApp
可以看到大量的Load command
$ objdump --macho --private-headers /Users/bepa/Library/Developer/Xcode/DerivedData/LoginApp-dmjlwlualsxjekeluddaletddbxm/Build/Products/Debug-iphonesimulator/LoginApp.app/LoginApp | grep 'LC_MAIN' -A 3
Mach-O = 文件配置 + 二进制代码(header+二进制)
链接的本质就是把多个目标文件组合成一个文件
网友评论