-
Mach-O
是Mach object
的缩写, 是Mac/iOS
上用于存储程序, 库的标准格式 -
属于
image.pngMach-O
格式的文件类型有
-
可以在
xnu
源码中, 查看到Mach-O
格式的详细定义
常见的Mach-O
文件类型
-
MH_OBJECT
-- 目标文件(.o)
-- 静态库文件(.a)
,静态库其实就是N
个.o
合并在一起 -
MH_EXECUTE
: 可执行文件 -
MH_DYLIB
: 动态库文件
--.dylib
--.framework/xx
-
MH_DYLINKER
: 动态链接编辑器
--/usr/lib/dyld
-
MH_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
的基本结构
image.png
- 一个
Mach-O
文件包含3
个主要区域
--Header
✅ 文件类型, 目标架构类型等
-- Load commands
✅ 描述文件在虚拟内存中的逻辑结构, 布局
-- Raw segment data
✅ 在Load comments
中定义的Segment
的原始数据
-
MachOView
, 用来查看Mach-O
文件结构的
image.png
dyld
和Mach-O
-
dyld
用于加载以下类型的Mach-O
文件
--MH_EXECUTE
--MH_DYLIB
--MH_BUNDLE
-
App
的可执行文件, 动态库都是由dyld
负责加载的
网友评论