程序加载过程中的链接器dyld工作原理
2023-10-30 15:09:01
程序加载概述
应用程序在执行之前,需要将代码和数据加载到内存中。这个过程通常由操作系统完成,在 macOS 中,负责此任务的组件是链接器 dyld(dynamic linker)。dyld 负责将应用程序的代码和数据从可执行文件加载到内存中,并解析应用程序对库的引用,将库加载到内存中。
dyld 的职责
dyld 的主要职责包括:
- 加载应用程序的可执行文件,并将其映射到虚拟地址空间。
- 加载应用程序所需的共享库,并将其映射到虚拟地址空间。
- 解析应用程序对符号的引用,并建立符号表。
- 初始化应用程序的全局变量和数据结构。
- 启动应用程序的入口函数。
dyld 的加载过程
dyld 的加载过程可以分为以下几个步骤:
- 加载应用程序的可执行文件
dyld 首先会加载应用程序的可执行文件,并将可执行文件映射到虚拟地址空间。可执行文件通常包含应用程序的代码、数据和符号表。
- 加载应用程序所需的共享库
dyld 会根据应用程序的依赖关系,加载应用程序所需的共享库。共享库通常包含应用程序需要使用的函数和数据。
- 解析应用程序对符号的引用
dyld 会解析应用程序对符号的引用,并建立符号表。符号表包含应用程序中所有符号的地址和名称。
- 初始化应用程序的全局变量和数据结构
dyld 会初始化应用程序的全局变量和数据结构。全局变量和数据结构通常存储应用程序的配置信息和运行时状态。
- 启动应用程序的入口函数
dyld 最后会启动应用程序的入口函数。入口函数通常是应用程序的主函数,它负责初始化应用程序并启动应用程序的运行。
虚拟地址空间的管理
dyld 在加载应用程序和共享库时,会将它们映射到虚拟地址空间。虚拟地址空间是一个连续的地址空间,它可以被应用程序和共享库使用。虚拟地址空间的管理由操作系统完成,操作系统会将虚拟地址空间划分为多个区域,每个区域都有自己的权限和保护机制。
库加载和动态链接
dyld 在加载应用程序时,会解析应用程序对库的引用,并将库加载到内存中。库加载过程通常分为以下几个步骤:
- 查找库
dyld 会根据应用程序的依赖关系,查找应用程序所需的库。库通常存储在系统目录或应用程序目录中。
- 加载库
dyld 会加载库,并将库映射到虚拟地址空间。库通常包含应用程序需要使用的函数和数据。
- 解析库中的符号
dyld 会解析库中的符号,并建立符号表。符号表包含库中所有符号的地址和名称。
- 重定位库中的符号
dyld 会重定位库中的符号,使它们能够在应用程序中正确使用。重定位过程通常涉及到修改库中的指令,使其能够正确引用应用程序中的符号。
- 初始化库
dyld 会初始化库,并调用库的初始化函数。初始化函数通常负责初始化库的数据结构和变量。
总结
dyld 是 macOS 中负责程序加载的组件。dyld 的主要职责包括加载应用程序的可执行文件、加载应用程序所需的共享库、解析应用程序对符号的引用、初始化应用程序的全局变量和数据结构,以及启动应用程序的入口函数。dyld 在加载应用程序和共享库时,会将它们映射到虚拟地址空间。dyld 还负责库加载和动态链接。