mach-o是Mac和iOS可执行文件的格式
- Mach-O
的组成结构:
- 头部(header structure)
- 加载命令(load command),告诉加载器如何处理二进制数据,有些是内核处理,有些是由动态链接器处理
- 段(segment),可以拥有多个段,每个段可以拥有0个或多个区域(section) ,每一个段(segment)
- 链接信息 ,一个完整的用户级Mach-o文件的末端是链接信息,其中包含了动态加载器用来链接可执行文件或者依赖库所需使用的符号表

Mach-O 加载过程
mach-o 有多种文件类型,比如
- Executable—Main binary for application
- Dylib—Dynamic library (aka DSO or DLL)
- Bundle—Dylib that cannot be linked, only dlopen(), e.g. plug-ins
Image—An executable, dylib, or bundle
Framework—Dylib with directory for resources and headers
理解mach-o和加载运行逻辑,可以帮我们做一些app启动时间优化:
cold launch: app不在内核缓冲存储器中
- 加载Dylib
加载系统的dylib很快,因为有优化,但是加载内嵌(embedded)的dylib文件很占时间,所以尽可能把多个内嵌dylib合并成一个来加载 - Rebase/Binding
- Initializer
显式初始化
- 使用
+initailize
来替代+load - 不要使用
__attribute__((constructor))
将方法显式标记为初始化器,而是让初始化方法调用时才执行。比如使用dispatch_once()
,pthread_once()
,std::once()
,也就是第一次使用时才初始化,推迟了一部分的工作耗时
显示Mach 和 BSD系统调用

Mach微内核(microkernel) 微内核
- 进程和线程抽象
- 虚拟内存管理
- 任务调度
- 线程间通信和消息传递机制
参考链接
读Joy__: 趣探 Mach-O:文件格式分析
Alone_Monkey: 了解Mach-o文件结构
官方文档
Optimizing App Startup Time
优化App启动时间
网友评论