XNU 怎么加载 App?
iOS 的可执行文件和动态库都是 Mach-O 格式,所以加载 APP 实际上就是加载 Mach-O 文件。
Mach-O header 信息结构代码如下:
1 | struct mach_header_64 { |
其中,文件类型 filetype 表示了当前 Mach-O 属于哪种类型。Mach-O 包括以下几种类型。
- OBJECT,指的是 .o 文件或者 .a 文件;
- EXECUTE,指的是IPA 拆包后的文件;
- DYLIB,指的是 .dylib 或 .framework 文件;
- DYLINKER,指的是动态链接器;
- DSYM,指的是保存有符号信息用于分析闪退信息的文件。
加载 Mach-O 文件,内核会 fork 进程,并对进程进行一些基本设置,比如为进程分配虚拟内存、为进程创 建主线程、代码签名等。用户态 dyld 会对 Mach-O 文件做库加载和符号解析。