返回

剖析应用程序加载流程:上篇,为什么libSystem要第一个加载?

IOS

引言

应用程序加载是操作系统中一个至关重要的过程,它负责将可执行文件和共享库加载到内存中,并为其执行做好准备。在macOS和iOS上,应用程序加载由dyld(动态链接器)负责。dyld是一个强大的工具,它不仅可以加载应用程序,还可以加载各种各样的插件和库。

dyld 加载 image 的过程

dyld 加载 image 的过程可以分为以下几个步骤:

  1. 映射 image 文件到内存

dyld首先会将 image 文件映射到内存中。image 文件是 Mach-O 格式的文件,它包含了应用程序的可执行代码、数据和资源。

  1. 重定位 image

接下来,dyld 会对 image 进行重定位。重定位是指将 image 中的地址调整为使其与内存中的地址相匹配。这是因为 image 文件中的地址通常是相对于其自身基址的,而内存中的地址是相对于进程基址的。

  1. 绑定 image

接下来,dyld 会将 image 中的符号绑定到相应的内存地址。符号是指代码或数据在内存中的地址。绑定符号可以使程序访问这些代码或数据。

  1. 初始化 image

最后,dyld 会调用 image 的初始化函数。初始化函数可以对 image 进行一些必要的初始化工作,例如初始化全局变量或设置环境变量。

为什么 libSystem 需要第一个加载?

libSystem 是 macOS 和 iOS 系统的核心库,它提供了许多基本的操作系统服务,例如内存管理、线程管理和文件系统访问。libSystem 是第一个加载的 image,因为它是所有其他应用程序和库的基础。

runtime 在什么时候注册 image load 的回调事件?

runtime 在 dyld 加载第一个 image 时注册 image load 的回调事件。回调事件是指当一个特定的事件发生时,操作系统会调用某个函数。runtime 注册的回调事件是 dyldLoadImageNotification,当 dyld 加载一个新的 image 时,操作系统会调用这个函数。

结语

在本文中,我们探讨了应用程序加载流程的上半部分,揭示了 libSystem 为何必须第一个加载,以及 runtime 在何时注册 image load 的回调事件。我们深入剖析了这些机制,揭开应用程序加载过程的神秘面纱。