Mach-O是Mach object的缩写, 是Mac/iOS上用于存储程序, 库的标准格式-
属于
Mach-O格式的文件类型有

可以在
xnu源码中, 查看到Mach-O格式的详细定义
常见的Mach-O文件类型
MH_OBJECT
-- 目标文件(.o)
-- 静态库文件(.a),静态库其实就是N个.o合并在一起MH_EXECUTE: 可执行文件MH_DYLIB: 动态库文件
--.dylib
--.framework/xxMH_DYLINKER: 动态链接编辑器
--/usr/lib/dyldMH_DSYM: 存储着二进制文件符号
--.dSYM/Contents/Resources/DWARF/xx(常用于分析App的崩溃信息)
Universal Binary (通用二进制文件)
- 通用二进制文件
-- 同时适用于多钟架构的二进制文件
-- 包含了多种不同架构的独立的二进制文件
$(ARCHS_STANDARD)是XCode内置的环境变量, 不同的XCode版本, 这个变量值不一样
因为需要储存多种架构的代码, 通用二进制文件通常比单一平台的二进制的程序要大
由于两种架构有共同的一些资源, 所以并不会达到单一版本的两倍之多
由于执行过程中, 只调用一部分代码, 运行起来也不需要额外的内存
因为文件比原来的要大, 也被称为"胖二进制文件"
(Fat Binary)命令行工具
file文件路径: 查看Mach-O的文件类型
lipo -info xxx查看架构信息
lipo xxx -thin armv7 -output yyy_armv7二进制文件瘦身, 通用架构拆成armv7架构
lipo xxx -thin arm64 -output yyy_arm64二进制文件瘦身, 通用架构拆成arm64架构
lipo -creat yyy_armv7 yyy_arm64 -output zzz合并架构
otool: 查看Mach-O特定部分和段的内容
Mach-O的基本结构

- 一个
Mach-O文件包含3个主要区域
--Header
✅ 文件类型, 目标架构类型等
-- Load commands
✅ 描述文件在虚拟内存中的逻辑结构, 布局
-- Raw segment data
✅ 在Load comments中定义的Segment的原始数据
-
MachOView, 用来查看Mach-O文件结构的

dyld和Mach-O
dyld用于加载以下类型的Mach-O文件
--MH_EXECUTE
--MH_DYLIB
--MH_BUNDLEApp的可执行文件, 动态库都是由dyld负责加载的










