「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。
MachO文件
Mach-O是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式。是一种用于可执行文件、目标代码、动态库的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。
类似于windows上的PE格式 (Portable Executable ),linux上的elf格式 (Executable and Linking Format)
Mach-O文件格式
-
目标文件.o
-
库文件
- .a
- .dylib
- framework
-
可执行文件
-
dyld
-
.dsym
实际开发中,MatchO文件有很多不同的类型,可以通过在Xcode上指定。
Targets→Build Settings→Linking→Mach-O Type
通用二进制文件
- 苹果公司提出的一种程序代码,能同时适用多种架构的二进制文件。
- 同一个程序包中同时为多种架构提供最理想的性能。
- 因为需要储存多种代码,通常比单一平台二进制的程序要大。
- 由于执行中只调用一部分代码,运行起来也不需要额外的内存。
在Xcode编译可以指定生成哪些架构的Match-O文件,同时也可以添加其他架构
Targets→Build Settings→Architectures→Architectures
设备的CPU架构(指令集)
-
模拟器:
- 4s-5: i386
- 5s-6s Plus: x86_64
-
真机(iOS设备):
- armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
- armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
- armv7s: iPhone 5、iPhone 5c
- arm64: iPhone 5s之后机型
Mach-O架构拆分、合并
- lipo工具
- 查看MachO架构
$lipo -info 'MachO文件'
- 拆分MachO架构
$lipo 'MachO文件' –thin '架构名' –output '目标MachO文件'
- 合并MachO架构
$lipo -create '第一个MachO文件' '第二个MachO文件 -output '目标MachO文件'
- file指令:查看文件信息
$file 文件路径
MachO文件结构
Mach-O 的组成结构如图所示,主要包括三个部分:Header、Load commands、Data
Header
包含二进制文件的一般信息,架构类型、字节顺序、加载指令的数量等。
struct mach_header_64 {
uint32_t magic; /* mach magic number identifier */
cpu_type_t cputype; /* cpu specifier */
cpu_subtype_t cpusubtype; /* machine specifier */
uint32_t filetype; /* type of file */
uint32_t ncmds; /* number of load commands */
uint32_t sizeofcmds; /* the size of all the load commands */
uint32_t flags; /* flags */
uint32_t reserved; /* reserved */
};
magic:定位结构是64位还是32位 (e.g. MH_MAGIC_64)
cputype:CPU类型 (e.g. CPU_TYPE_ARM64)
cpusubtype:CPU具体类型 (e.g. CPU_SUBTYPE_ARM64_ALL)
filetype:文件类型 (e.g. MH_EXECUTE)
ncmds:Load Commands条数
sizeofcmds:Load Commands大小
flags:标志位。标识二进制文件支持的功能,主要和系统加载、链接有关
reserved:预留区(只有64位才有)