一.MachO文件介绍
1.MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似Windows上的PE格式(Portable Executable),linux上的ELF格式(Executable and Linking Format)
2.作为.out格式的替代,Mach-O提供更强的扩展性
3.常见MachO格式的文件
a.目标文件.o
b.库文件 .a .dylib Framework
c.可执行文件
d.dyld
e.dsym
二.通用二进制文件(Universal binary)
苹果公司提出的一种程序代码,能同时适用多种架构的二进制文件。同一程序包中同时为多种架构提供最理想的性能。需要存储多种代码,通用二进制文件通常比单一平台二进制的程序要大,但因为有共通的非执行资源,所以不会达到单一版本的几倍之多。而且执行时只调用一部分代码,运行起来也不需要额外的内存。
三.lipo命令
1.使用lipo -info查看MachO文件包含的架构 armv7 armv7s arm64
lipo -info MachO文件
2.使用lipo -thin拆分某种架构
lipo MachO文件 -thin 架构 -output 输出文件路径
3.使用 lipo -create合并多种架构
lipo -create MachO1 MachO2 -output 输出文件路径
四.MachO文件结构
1.Mach Header
Header包含该二进制文件的一般信息。字节顺序、架构类型、加载指令的数量等。使得可以快速确认一些信息,比如当前文件使用32位还是64位,对应的处理器是什么、文件类型是什么等
struct mach_header_64 {
unit32_t magic; /* 魔数,快速定位属于32位还是64位,MH_MAGIC_64 */
cpu_type_t cputype; /* CPU类型,比如CPU_TYPE_ARM */
cpu_subtype_t cpusubtype; /* CPU的具体类型,比如CPU_SUBTYPE_ARM_V7 / CPU_SUBTYPE_ARM_V7S / CPU_SUBTYPE_ARM64_ALL */
unit32_t filetype; /* 文件类型,比如可执行文件,MH_EXECUTE */
unit32_t ncmds; /* loadCommands条数 */
unit32_t sizeofcmds; /* loadCommonds大小 */
unit32_t flags; /* 标志位标识二进制文件支持的功能,主要是和系统加载、链接有关 */
unit32_t reserved;
}
2.Load commands
一张包含很多内容的表,内容包括位置的区域、符号表、动态符号表等
LC_SEGMENT_64 将文件中(32位或64位)的段映射到进程地址空间中
LC_DYLD_INFO_ONLY 动态链接相关信息
LC_SYMTAB 符号地址
LC_DYSYMTAB 动态符号表地址
LC_LOAD_DYLINKER 使用谁加载,我们使用dyld
LC_UDID 文件的UDID
LC_VERSION_MIN_IPHONEOS 支持最低的操作系统版本
LC_SOURCE_VERSION 源代码版本
LC_MAIN 设置程序主线程的入口地址和栈大小
LC_LOAD_DYLIB 依赖库的路径,包含第三方
LC_FUNCTION_STARTS 函数起始地址表
LC_CODE_SIGNATURE 代码签名
3.Data
包含Segement的具体数据