返回

应用程序的加载(下)

IOS

dyld::_main

dyld::_main函数是整个应用程序加载过程中最重要的函数之一。它是dyld库的入口点,负责完成应用程序加载的最后阶段。该函数执行以下步骤:

  1. 调用dyld::initializeMain函数,进行一些初始化工作,如设置信号处理程序、初始化标准I/O等。
  2. 调用dyld::loadMainExecutable函数,加载应用程序的主可执行文件。
  3. 调用dyld::bindMainExecutable函数,将应用程序的主可执行文件绑定到地址空间。
  4. 调用dyld::startMainExecutable函数,启动应用程序的主可执行文件。

dyld::initializeMain

dyld::initializeMain函数在dyld::_main函数中被调用,主要负责一些初始化工作,包括:

  1. 设置信号处理程序。当应用程序收到信号时,这些处理程序将被调用。
  2. 初始化标准I/O。将标准输入、标准输出和标准错误流重定向到合适的设备。
  3. 初始化堆和栈。堆和栈是应用程序运行时所需的数据结构。
  4. 初始化环境变量。环境变量是应用程序运行时可以访问的变量。

dyld::loadMainExecutable

dyld::loadMainExecutable函数在dyld::_main函数中被调用,主要负责加载应用程序的主可执行文件。该函数执行以下步骤:

  1. 打开应用程序的主可执行文件。
  2. 将应用程序的主可执行文件映射到内存。
  3. 验证应用程序的主可执行文件。
  4. 将应用程序的主可执行文件加载到内存。

dyld::bindMainExecutable

dyld::bindMainExecutable函数在dyld::_main函数中被调用,主要负责将应用程序的主可执行文件绑定到地址空间。该函数执行以下步骤:

  1. 为应用程序的主可执行文件分配地址空间。
  2. 将应用程序的主可执行文件复制到地址空间。
  3. 更新应用程序的主可执行文件的页表。

dyld::startMainExecutable

dyld::startMainExecutable函数在dyld::_main函数中被调用,主要负责启动应用程序的主可执行文件。该函数执行以下步骤:

  1. 将程序计数器设置为应用程序的主可执行文件的入口点。
  2. 开始执行应用程序的主可执行文件。

至此,应用程序的加载过程就完成了。应用程序已经加载到内存中,并开始执行。

小结

在本文中,我们深入了解了应用程序加载的最后阶段,包括dyld::_main函数、dyld::initializeMain函数、dyld::loadMainExecutable函数、dyld::bindMainExecutable函数和dyld::startMainExecutable函数。这些函数共同完成了应用程序的加载和启动过程。