我们都知道 Mach-O (Mach Object)是 OS X / iOS 系统的可执行文件,用于存储程序、库的标准格式。
官方介绍的总共有 11 种格式!常见的格式有:
- 可执行文件
- object文件
.o 文件(目标文件)
.a 文件(静态库文件,其实就是n个 .o 文件的集合) - 动态库文件
dylib 文件(mac os 下)
framework 文件(iOS下) - dyld文件(动态加载器)
- DSYM文件(用来分析App的崩溃信息)
Mach-O 文件有如下几个部分组成:
- Header:保存了一些基本信息,包括了该文件运行的平台、文件类型、LoadCommands的个数等等。
- LoadCommands:可以理解为加载命令,在加载Mach-O文件时会使用这里的数据来确定内存的分布以及相关的加载命令。比如我们的main函数的加载地址,程序所需的dyld的文件路径,以及相关依赖库的文件路径。
- Data: 这里包含了具体的代码、数据等等。
动态库共享缓存
动态库在整个系统里面只有一份,为了提高性能,系统的动态库文件都存在了动态库共享缓存里面。
动态加载器(dyld)
用来链接加载动态库
一个APP的启动过程如下:
- 系统先读取App的可执行文件(Mach-O文件),从里面获得dyld的路径,然后加载dyld
- dyld去初始化运行环境,开启缓存策略,加载程序相关依赖库(其中也包含我们的可执行文件),并对这些库进行链接,最后调用每个依赖库的初始化方法,在这一步,runtime被初始化。
- 当所有依赖库的初始化后,轮到最后一位(程序可执行文件)进行初始化,这时runtime对项目中所有类进行类结构初始化,然后调用所有的load方法。
- dyld返回main函数地址,main函数被调用
详细过程请移步:
iOS程序启动->dyld加载->runtime初始化(初识)
程序的启动链接过程