Mach-O
Mach-O是Mach object的缩写,是Mac/iOS上用于存储程序、库的标准格式
可以在xun的源码中找到Mach-O的定义,地址:https://opensource.apple.com/tarballs/xnu/
常见的Mach-O文件类型
- MH_OBJECT
- 目标文件(.o)
- 静态库文件(.a),静态库其实就是N个.o合并在一起
- MH_EXECUTE:可执行文件
- .app/xx
- MH_DYLIB:动态库文件
- .dylib
- .framework/xx
- MH_DYLINKER:动态链接编辑器
- /usr/lib/dyld
- MH_DSYM:存储着二进制文件符号信息的文件
- .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)
Mach-O的基本结构
一个Mach-O文件包含3个主要区域
- Header : 文件类型、目标架构类型等
- Load commands: 描述文件在虚拟内存中的逻辑结构、布局
- Raw segment data :在Load commands中定义的Segment的原始数据
查看Mach-O的结构
- 命令行工具
- file:查看Mach-O的文件类型
file 文件路径
- file:查看Mach-O的文件类型
- otool:查看Mach-O特定部分和段的内容
- lipo:常用于多架构Mach-O文件的处理
- 查看架构信息:
lipo -info 文件路径
- 导出某种特定架构:
lipo 文件路径 -thin 架构类型 -output 输出文件路径
- 合并多种架构:
lipo 文件路径1 文件路径2 -output 输出文件路径
- 查看架构信息:
- GUI工具
- MachOView(https://github.com/gdbinit/MachOView)
Universal Binary(通用二进制文件)
同时适用于多种架构的二进制文件
包含了多种不同架构的独立的二进制文件
因为需要储存多种架构的代码,通用二进制文件通常比单一平台二进制的程序要大
由于两种架构有共同的一些资源,所以并不会达到单一版本的两倍之多
由于执行过程中,只调用一部分代码,运行起来也不需要额外的内存
因为文件比原来的要大,也被称为“胖二进制文件”(Fat Binary)
dyld和Mach-O
dyld用于加载以下类型的Mach-O文件;
- MH_EXECUTE
- MH_DYLIB
- MH_BUNDLE
APP的可执行文件、动态库都是由dyld负责加载的
网友评论