Mach-O

Mach-O

维基百科介绍Mach-O:

Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件,目标代码,动态库,内核转储的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性,并提升了符号表中信息的访问速度。
Mach-O曾经为大部分基于Mach核心的操作系统所使用。NeXTSTEP,Darwin和Mac OS X等系统使用这种格式作为其原生可执行文件,库和目标代码的格式。而同样使用GNU Mach作为其微内核的GNU Hurd系统则使用ELF而非Mach-O作为其标准的二进制文件格式。
每个Mach-O文件包括一个Mach-O头,然后是一系列的载入命令,再是一个或多个块,每个块包括0到255个段。Mach-O使用REL再定位格式控制对符号的引用。Mach-O在两级命名空间中将每个符号编码成“对象-符号名”对,在查找符号时则采用线性搜索法。

目标文件的理解,参考《程序员的自我修养》:

  • 《程序员的自我修养》读书笔记——目标文件

目标文件相对于最终的可执行文件而言,结构上已经和可执行文件的结构基本一样了。只是还没有经过链接过程,某些符号、地址还没被重定位,大部分内容都已经具备了。

可执行文件的格式在Windows(PE-Portable Executable)和Linux(ELF- Executable Linkable Format)、Mac(Mach-O)不同,前两者都是基于COFF(Common file format)格式的,除此之外还有其他不常见的,如Intel/Microsoft的OMF、Unix a.out、MS-Doc .Com格式等

广义上将,目标文件与可执行文件格式几乎一样,可以看成同一种类型的文件。

动态链接库(window .dll、Linux .so)及静态链接库(window lib、Linux .a)、Mac(dylb,tbd)都是按照可执行文件的格式存储。静态库稍微不同,因为他是把很多目标文件集合在一起,需要在头部加上一些索引。也就是包含了很多目标文件的一个目标文件包。
ELF格式文件更可以做如下归纳(目标文件.o 静态库、可执行文件、动态库):
Mach-O_第1张图片
Mach-O_第2张图片
目标文件中的内容至少有编译后的机器指令代码、数据。还包括了链接时所需要的一些信息,比如符号表、调试信息、字符串等

一般目标文件将这些信息按不同的属性,以节(section)的形式存储,有时候也叫做段(Segment),在一般轻情况下,都便是一个一定长度的区域

Mach-O文件格式

参考:

  • 趣探 Mach-O:文件格式分析
  • Mach-O可执行文件
  • Apple 操作系统可执行文件 Mach-O

Mach-O_第3张图片

Header

Mach-O的头部,使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应的处理器是什么、文件类型是什么

Load commands

上面头部中的数据已经说明了整个Mach-O文件的基本信息,但整个Mach-O中最重要的还要数加载命令。它说明了操作系统应当如何加载文件中的数据,对系统内核加载器和动态链接器起指导作用。一来它描述了文件中数据的具体组织结构,二来它也说明了进程启动后,对应的内存空间结构是如何组织的。

Data

Data 由 Segment 的数据组成,是 Mach-O 占比最多的部分,有代码有数据,比如符号表。Data 共三个 Segment,TEXT、DATA、LINKEDIT。其中 TEXT 和 DATA 对应一个或多个 Section,LINKEDIT 没有 Section,需要配合 LC_SYMTAB 来解析 symbol table 和 string table。这些里面是 Mach-O 的主要数据。

Mach-O加载过程

参考:

  • iOS 底层探索 - 应用加载

  • 理解 Mach O 并提高程序启动速度

其它

  • Mach-O 可执行文件

你可能感兴趣的:(iOS,进阶,mach-o)