当前位置:首页 > 内存 > 正文

动态库内存映射

  • 内存
  • 2024-08-13 06:53:12
  • 7619

一、认识dyld:动态链接器

dyld(thedynamiclinkeditor)是Apple的动态链接器,是Apple操作系统的组成部分。XNU系统内核完成加载Mach-O文件并设置程序后,dyld负责剩余的工作。在macOS系统上,dyld位于D/usr/lib/dyld中。
dyldGithub源码地址

因为Foundation还会依赖一些其他的动态库,而这些依赖的库也会依赖更多的库,所以会出现很多相互依赖的符号,需要时间处理时间也会更长。该系统上的动态链接器将使用位于/var/db/dyld/中的共享缓存。当加载Mach-O文件时,动态链接器首先检查是否有共享缓存。每个进程都会将这个共享缓存映射到自己的地址空间中,这样可以优化App的启动速度。

链接共享库分为静态库和动态库:

Mach-O文件是编译后的产物,而动态库是在运行时链接的,不参与Mach-O,因此Mach-O文件不包含动态库中的符号定义。即该符号会显示为“undefined”,但会记录对应的库名和路径。运行时通过dlopen和dlsym导入动态库时,首先根据记录的库路径找到对应的库,然后通过记录的名称符号找到绑定地址。

dlopen会将共享库加载到正在运行的进程的地址空间中。加载的共享库也会有未定义的符号,这会触发更多的共享库被加载。dlopen还可以选择是立即解析所有引用还是延迟解析。dlopen打开动态库后,返回一个引用指针。dlsym的作用是通过动态库指针和dlopen返回的函数符号得到函数地址,然后使用。

dyld3是一个全新的动态链接器,它彻底改变了动态链接的概念。WWDC-AppStartupTime:过去、现在和未来提到,在iOS13系统中,iOS全面使用新的dyld3来替代之前版本的dyld2。dyld3带来了显着的性能提升并减少了APP启动时间。由于dyld3与dyld2完全兼容,并且API接口相同,因此在大多数情况下,开发者无需进行额外的定制就可以平滑过渡。

它是一个内存映射文件,不需要用复杂的方法来分析我们只能验证一下,它的作用就是提高速度

dyld2默认使用lazysymbol加载方式,但是在dyld3中。,在App启动之前,符号解析结果已经在launch闭包中,因此不再需要lazysymbol。目前,如果存在缺失符号,APP的表现会有所不同:在dyld2中,第一次调用缺失符号时APP会崩溃,缺失符号会导致APP一启动就崩溃。