返回

程序加载过程中的链接器dyld工作原理

IOS

程序加载概述

应用程序在执行之前,需要将代码和数据加载到内存中。这个过程通常由操作系统完成,在 macOS 中,负责此任务的组件是链接器 dyld(dynamic linker)。dyld 负责将应用程序的代码和数据从可执行文件加载到内存中,并解析应用程序对库的引用,将库加载到内存中。

dyld 的职责

dyld 的主要职责包括:

  • 加载应用程序的可执行文件,并将其映射到虚拟地址空间。
  • 加载应用程序所需的共享库,并将其映射到虚拟地址空间。
  • 解析应用程序对符号的引用,并建立符号表。
  • 初始化应用程序的全局变量和数据结构。
  • 启动应用程序的入口函数。

dyld 的加载过程

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

  1. 加载应用程序的可执行文件

dyld 首先会加载应用程序的可执行文件,并将可执行文件映射到虚拟地址空间。可执行文件通常包含应用程序的代码、数据和符号表。

  1. 加载应用程序所需的共享库

dyld 会根据应用程序的依赖关系,加载应用程序所需的共享库。共享库通常包含应用程序需要使用的函数和数据。

  1. 解析应用程序对符号的引用

dyld 会解析应用程序对符号的引用,并建立符号表。符号表包含应用程序中所有符号的地址和名称。

  1. 初始化应用程序的全局变量和数据结构

dyld 会初始化应用程序的全局变量和数据结构。全局变量和数据结构通常存储应用程序的配置信息和运行时状态。

  1. 启动应用程序的入口函数

dyld 最后会启动应用程序的入口函数。入口函数通常是应用程序的主函数,它负责初始化应用程序并启动应用程序的运行。

虚拟地址空间的管理

dyld 在加载应用程序和共享库时,会将它们映射到虚拟地址空间。虚拟地址空间是一个连续的地址空间,它可以被应用程序和共享库使用。虚拟地址空间的管理由操作系统完成,操作系统会将虚拟地址空间划分为多个区域,每个区域都有自己的权限和保护机制。

库加载和动态链接

dyld 在加载应用程序时,会解析应用程序对库的引用,并将库加载到内存中。库加载过程通常分为以下几个步骤:

  1. 查找库

dyld 会根据应用程序的依赖关系,查找应用程序所需的库。库通常存储在系统目录或应用程序目录中。

  1. 加载库

dyld 会加载库,并将库映射到虚拟地址空间。库通常包含应用程序需要使用的函数和数据。

  1. 解析库中的符号

dyld 会解析库中的符号,并建立符号表。符号表包含库中所有符号的地址和名称。

  1. 重定位库中的符号

dyld 会重定位库中的符号,使它们能够在应用程序中正确使用。重定位过程通常涉及到修改库中的指令,使其能够正确引用应用程序中的符号。

  1. 初始化库

dyld 会初始化库,并调用库的初始化函数。初始化函数通常负责初始化库的数据结构和变量。

总结

dyld 是 macOS 中负责程序加载的组件。dyld 的主要职责包括加载应用程序的可执行文件、加载应用程序所需的共享库、解析应用程序对符号的引用、初始化应用程序的全局变量和数据结构,以及启动应用程序的入口函数。dyld 在加载应用程序和共享库时,会将它们映射到虚拟地址空间。dyld 还负责库加载和动态链接。