Mach-O文件

我们都知道 Mach-O (Mach Object)是 OS X / iOS 系统的可执行文件,用于存储程序、库的标准格式。
官方介绍的总共有 11 种格式!常见的格式有:

  1. 可执行文件
  2. object文件
      .o 文件(目标文件)
      .a 文件(静态库文件,其实就是n个 .o 文件的集合)
  3. 动态库文件
      dylib 文件(mac os 下)
      framework 文件(iOS下)
  4. dyld文件(动态加载器)
  5. DSYM文件(用来分析App的崩溃信息)

Mach-O 文件有如下几个部分组成:

  1. Header:保存了一些基本信息,包括了该文件运行的平台、文件类型、LoadCommands的个数等等。
  2. LoadCommands:可以理解为加载命令,在加载Mach-O文件时会使用这里的数据来确定内存的分布以及相关的加载命令。比如我们的main函数的加载地址,程序所需的dyld的文件路径,以及相关依赖库的文件路径。
  3. Data: 这里包含了具体的代码、数据等等。

动态库共享缓存

动态库在整个系统里面只有一份,为了提高性能,系统的动态库文件都存在了动态库共享缓存里面。

动态加载器(dyld)

用来链接加载动态库

一个APP的启动过程如下:

  1. 系统先读取App的可执行文件(Mach-O文件),从里面获得dyld的路径,然后加载dyld
  2. dyld去初始化运行环境,开启缓存策略,加载程序相关依赖库(其中也包含我们的可执行文件),并对这些库进行链接,最后调用每个依赖库的初始化方法,在这一步,runtime被初始化。
  3. 当所有依赖库的初始化后,轮到最后一位(程序可执行文件)进行初始化,这时runtime对项目中所有类进行类结构初始化,然后调用所有的load方法。
  4. dyld返回main函数地址,main函数被调用

详细过程请移步:
iOS程序启动->dyld加载->runtime初始化(初识)
程序的启动链接过程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Mach-O类型的文件 Mach-O是一种文件的格式; 是iOS/Mac OS上存储程序以及库的标准格式Mach ...
    其字德安阅读 10,753评论 0 13
  • 上一篇博客介绍了mach_header相关内容,Mach-O文件介绍之mach_header。这篇博客主要介绍Ma...
    Tomychen阅读 7,089评论 0 7
  • 原文地址 写在之前 之前工作中对Mach-O文件有一定的接触, 原本早就想写一篇文章分享一下,但是奈何只是不够深入...
    南栀倾寒阅读 10,289评论 3 22
  • 熟悉Linux和windows开发的同学都知道,ELF是Linux下可执行文件的格式,PE32/PE32+是win...
    Klaus_J阅读 9,449评论 1 10
  • 早起 天才蒙蒙亮,就醒了,一看手机,才七点。自从女儿上初中,每天早上要给她做饭,还要送她上学开始,现在已经习惯定点...
    飘飘洒洒_e88b阅读 1,735评论 0 2