返回

应用程序的加载下:揭秘dyld链接objc函数执行流程

IOS

_dyld_objc_notify_register 方法的全面解析

在 Objective-C 程序的链接过程中,_dyld_objc_notify_register 方法发挥着至关重要的作用。它负责从 Mach-O 二进制文件中提取并初始化 Objective-C 运行时数据结构,为运行时的平稳运行奠定基础。本篇博文将深入探讨此方法的实现细节,帮助你了解 Objective-C 程序加载和初始化过程中的关键步骤。

Mach-O 二进制文件结构

在理解 _dyld_objc_notify_register 方法之前,有必要了解 Mach-O 二进制文件格式。Mach-O 是苹果公司为 macOS 和 iOS 平台开发的可执行和库文件格式。它由多个称为加载命令的块组成,这些块了二进制文件的内容和结构。

为了加载 Objective-C 代码,Mach-O 二进制文件通常包含以下加载命令:

  • LC_SEGMENT: 定义了二进制文件中的代码和数据段。
  • LC_SEGMENT_64: 64 位 Mach-O 文件中的 LC_SEGMENT 等效项。
  • LC_SYMTAB: 符号表,其中包含二进制文件中符号的地址和类型信息。
  • LC_DYSYMTAB: 动态符号表,其中包含符号的动态链接信息。

_dyld_objc_notify_register 方法

_dyld_objc_notify_register 方法是 Objective-C 运行时库的一部分,在二进制文件链接到进程地址空间时被调用。它的作用是提取 Objective-C 运行时数据结构并将其初始化为适当的值。

该方法首先获取 Mach-O 文件头的地址并遍历加载命令以查找相关的加载命令。它检索代码段和数据段的地址,还检索符号表和动态符号表的地址。

下一步是查找称为 "__objc_imageinfo" 的特殊节。此节包含 Objective-C 运行时信息,例如:

  • 类列表
  • 方法列表
  • 选择器列表
  • 协议列表

该方法提取 "__objc_imageinfo" 节中的数据并将其初始化为相应的数据结构。它遍历类列表,并为每个类查找并初始化 dealloc、release、retain 和 autorelease 方法。它还遍历方法列表,并为每个方法查找并初始化关联的 selector。

总结

_dyld_objc_notify_register 方法是 Objective-C 程序加载过程中的关键步骤。它负责从 Mach-O 二进制文件中提取和初始化 Objective-C 运行时数据结构。通过理解该方法的实现细节,你可以深入了解 Objective-C 程序的启动和运行时机制。

常见问题解答

  • 问:_dyld_objc_notify_register 方法在哪里实现?
    答:该方法在 objc4-818.2 代码中实现。
  • 问:该方法如何获取 Mach-O 文件头地址?
    答:该方法从参数 mh 中获取 Mach-O 文件头地址。
  • 问:该方法如何查找 "__objc_imageinfo" 节?
    答:该方法遍历代码段中的节以查找具有 "__objc_imageinfo" 名称和 "__LINKEDIT" 段名称的节。
  • 问:该方法如何初始化类的方法列表?
    答:该方法遍历类列表中的每个类,并从 "__objc_imageinfo" 节中提取该类的方法列表地址。
  • 问:该方法如何查找与方法关联的 selector?
    答:该方法使用从 "__objc_imageinfo" 节中提取的 selector 列表来查找与方法关联的 selector。