OC底层原理(11)dyld 加载流程

258 阅读4分钟

1.dyld介绍

dyld是苹果的动态连接器,是苹果操作系统的重要组成,在系统编译好后,交给dylb进行链接把依赖的库生成可执行文件。英文全称是:the dynamic link editor.简单介绍一下苹果的dyld的历史

  • dyld1 :dyld 1,并于1996年作为NeXTStep 3.3的一部分发货。在此之前,NeXT使用静态二进制文件。值得注意的是,这早于POSIX dlopen调用标准化。现在,dlopen确实存在于一些Unix上。它们是后来人们采用的专有扩展。NeXTStep有不同的专有扩展,因此人们在早期版本的macOS 10上编写第三方包装,以支持标准的Unix软件。问题是他们不太支持同式语义。有一些奇怪的边缘情况不起作用,最终它们有点慢。在发布 macOS 10.0、猎豹之前,我们还添加了另一个功能,即预绑定。预绑定是一种技术,我们将尝试为系统中的每个dylib和您的应用程序找到固定地址,动态加载程序将所有内容加载到这些地址,如果成功,它将编辑所有这些二进制文件,以包含这些预计算地址,然后下次它将它们放在相同的地址时,它不需要做任何额外的工作。
  • dyld2 :dyld 2是dyld的完全重写。它正确地支持C++初始化器语义,因此我们略微扩展了mach-o格式,并更新了dyld,以便获得高效的C++库支持。它还具有完整的原生dlopen和dlsym实现,语义正确,此时我们不建议使用Legacy API。它们仍在 macOS 上。他们从未在我们的任何其他平台上发货。它是为速度而设计的,由于它是为速度而设计的,所以它的理智检查有限。我们没有今天的恶意软件环境。最后,我们提高了性能,因为我们提高了性能,我们可以摆脱预绑定,代之以所谓的共享缓存。那么什么是共享缓存呢?嗯,它是在iOS 3.1和macOS Snow Leopard中引入的,它完全取代了预绑定。这是一个包含大多数系统dylibs的单个文件。由于我们将它们合并到一个文件中,我们可以进行某些类型的优化。我们可以重新排列他们所有的文本段和所有数据段,并重写他们的整个符号表,以减少大小,因此我们需要在每个进程中装载更少的区域。它还允许我们打包二进制段并节省大量内存。它实际上是dylibs的前链接器。
  • dyld3 :dyld 3 是一款全新的动态链接器,我们今天宣布。这是对我们如何进行动态链接的完全反思,本周种子中大多数macOS系统应用程序默认打开,2017年苹果操作系统平台上的所有系统应用程序默认打开安全。因此,正如我所说,我们将许多安全功能改装为dyld 2,但事后添加此类内容确实很难。我认为近年来我们做得很好,但真的很难做到。那么,我们是否可以进行更积极的安全检查,并预先设计安全?最后,可测试性和可靠性。能不能让dyld更容易测试?因此,苹果推出了大量很棒的测试框架,如XCTest,您应该使用,我们也应该使用,但它们依赖于动态链接器的低级功能将这些库插入到流程中,因此它们基本上不能用于测试现有的dyld代码,这也使我们更难测试安全性和性能功能。那么我们是怎么做到的呢?嗯,我们已经把大部分染料移到了流程之外。现在它基本上只是一个普通的守护进程,我们可以像其他人使用标准测试工具一样进行测试,这将使我们能够在未来更快地改进它。它还允许保持过程的dyld位尽可能小,并减少应用程序中的攻击表面。它还加快了启动速度,因为最快的代码是您从未编写过的代码,紧随其后的是您几乎从未执行的代码。dyld 3是一个进程外的mach-o解析器。 只是摘要了下大概,具体大家可以看WWDC17:应用启动时间:过去、现在和未来

参考: