Mach-O简介
Mach-O是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式
除了可执行文件,还有其他文件也是使用mach-O格式
Mach-O格式的常见文件
目标文件.o
库文件:.a、.dylib、Framework
可执行文件
dyld(动态链接器)
.dsym(符号表)
Mach-O 并非一定是可执行文件 , 它是一种文件格式 , 分为 Mach-O Object 目标文件 、 Mach-O ececutable 可执行文件、 Mach-O dynamically 动态库文件、 Mach-O dynamic linker 动态链接器文件、 Mach-O dSYM companion 符号表文件 , 等等
架构
通用二进制架构
lipo create 命令合并架构
lipo -info命令可以查看.a所支持架构
Mach-O文件结构
- Header:包含二进制文件的一般信息(字节顺序,架构类型,加载指令的数量)
- Load conmands:包含很多内容的表(区域的位置,符号表,动态符号表)
- Data:包含Segment信息
Mach Header
struct mach_header_64 {
uint32_t magic; /* 魔数,快速定位64位/32位 */
cpu_type_t cputype; /* cpu 类型 比如 ARM */
cpu_subtype_t cpusubtype; /* cpu 具体类型 比如arm64 , armv7 */
uint32_t filetype; /* 文件类型 例如可执行文件 .. */
uint32_t ncmds; /* load commands 加载命令条数 */
uint32_t sizeofcmds; /* load commands 加载命令大小*/
uint32_t flags; /* 标志位标识二进制文件支持的功能 , 主要是和系统加载、链接有关*/
uint32_t reserved; /* reserved , 保留字段 */
};
Load commands
告诉链接器如何加载mach-o文件
LC_segment_64:将文件中(32为或64位)的映射到进程地址空间中。
...等等
_TEXT
主程序代码
_stubs、_stub_helper:动态链接
_objc_methodname:方法名称
_DATA
紧跟text段之后
_got:Non-lazy Symbol Pointer:非懒加载符号表














网友评论