一、MachO文件
- MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似于windows上的PE格式(Portable Executable), linux上的elf格式(Executable and Linking Format)
二、MachO文件结构
- Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件、目标代码、动态库的文件格式.作为 a.out格式的替代,MachO提供了更强的扩展性
2.1 属于MachO格式的常见文件
-
- 目标文件 .o
- 库文件
- .a
- .dylib
- Framework
- 可执行文件
- dyld
- .dsym
- File指令
- 通过 $file 文件路径 查看文件类型
2.2 通用二进制文件(Universal binary)
- 苹果公司提出的一种程序代码.能同时适用多种架构的二进制文件
- 同一个程序包中同时为多种架构提供最理想的性能
- 因为需要存储多种代码,通用二进制应用程序通常比单一平台二进制的程序更大.
- 但是 由于两种架构有共通的非执行资源(代码以外的),所以并不会达到单一版本的两倍之多.
- 而且由于执行中只调用一部分代码,运行起来也不需要额外的内存.
2.3 lipo命令
- 使用lipo -info 可以查看MachO文件包含的架构
- lipo -info MachO文件
- 使用 lipo -thin 拆分某种架构
- lipo MachO文件 -thin架构 -output输出文件路径
- 使用lipo -create 合并多种架构
- lipo -create MachO1 MachO2 -output 输出文件路径
2.4 MachO文件结构
MachO的组成结构如图所示包括了
- Header : 包含二进制文件的一般信息
- 字节顺序、架构类型、加载指令的数量等
- 使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应的处理器是什么、文件类型是什么.
- Load Commands 一张包含很多内容的表
- 内容包括区域的位置、符号表、动态符号表等.
- Data通常是MachO文件中最大的部分
- 包含Segment的具体数据
2.4.1 Header的数据结构
#import <mach-o/loader.h>
/*
* The 64-bit mach header appears at the very beginning of object files for
* 64-bit architectures.
*/
struct mach_header_64 {
uint32_t magic; /* mach magic number identifier */
int32_t cputype; /* cpu specifier */
int32_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位
- cputype: CPU类型,比如ARM
- cpusubtype: CPU的具体类型 arm64/ armv7
- filetype: 文件类型,比如可执行文件
- ncmds: loadCommands条数
- sizeofcmds LoadCommands的大小
- flags 标志位标识二进制文件支持的功能. 主要是和系统加载、链接有关
- reserved 保留字段
2.4.2 虚拟内存
VM Addr : 虚拟内存地址
VM Size: 虚拟内存大小
File offset: 数据在文件中偏移量
File size: 数据在文件中的大小
2.4.3 LoadCommands
LC_SEGMENT_64 |
将文件中(32位或64位)的段映射到进程地址空间中 |
LC_DYLD_INFO_ONLY |
动态链接相关信息 |
LC_SYMTAB |
符号地址 |
LC_DYSYMTAB |
动态符号表地址 |
LC_LOAD_DYLINKER |
使用谁加载,我们使用dyld |
LC_UUID |
文件的UUID |
LC_VERSION_MIN_MACOSX |
支持最低的操作系统版本 |
LC_SOURCE_VERSION |
源代码版本 |
LC_MAIN |
设置程序主线程的入口地址和栈大小 |
LC_LOAD_DYLIB |
依赖库的路径,包含三方库 |
LC_FUNCTION_STARTS |
函数起始地址表 |
LC_CODE_SIGANTURE |
代码签名 |
三、DYLD
dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作系统一个重要组成部分,在系统内核做好程序准备工作之后,交由dyld负责余下的工作.
四、总结
- MachO属于一种文件格式
- 包含: 可执行文件、静态库、动态库、dyld等等
- 可执行文件:
- 通用二进制文件: 集合了多种架构
- lipo命令
- -thin拆分架构
- -create 合并架构
- MachO结构
- Header
- 用于快速确定该文件的CPU类型、文件类型
- Load Commands
- 指示加载器如何设置并且加载二进制数据
- Data
- 存放数据: 代码、数据、字符串常量、类、方法等等
- Header
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/106330.html