> 文章列表 > 9、MachO简介

9、MachO简介

9、MachO简介

一、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
      • 存放数据: 代码、数据、字符串常量、类、方法等等