IOS main函数运行前的dydl动态链接库

来源:互联网 发布:分析知乎日报app 编辑:程序博客网 时间:2024/06/10 17:04

在IOS中,main函数运行前,有一系列复杂的操作,虽然我们不需要关心具体的实现,但是需要了解其具体流程。

由于IOS系统是动态编译,需要在运行时把所有系统用到的库动态加载,其中有两个默认添加的lib.libobjc即objc和runtime,libSystem中包含了很多系统级别lib,列几个熟知的:libdispatch(GCD),libsystem_c(C语言库),libsystem_blocks(Block),libcommonCrypto(常用的md5函数)等等。

系统使用动态链接有几点好处:

  • 代码共用:很多程序都动态链接了这些lib,但它们在内存和磁盘中中只有一份
  • 易于维护:由于被依赖的lib是程序执行时才link的,所以这些lib很容易做更新,比如libSystem.dylib是libSystem.B.dylib的替身,哪天想升级直接换成libSystem.C.dylib然后再替换替身就行了
  • 减少可执行文件体积:相比静态链接,可执行文件的体积要小很多
dyld(Dynamic Linker Editor)动态链接器:

动态连接器充当ImageLoader()和runtime的协调者,首先将程序依赖的动态链接库递归加载进内存通过初始化runtime,当有新的image文件(包含了我们的类、方法等各种符号)加载内存后,dyld回调runtime,把这些类、方法等各种符号交由runtime管理,此后runtime的那些方法(动态添加Class、方法混合等等才能生效)

整个过程如下:

  1. dyld开始将程序二进制文件初始化
  2. 交由ImageLoader读取image,其中包含了我们的类、方法等各种符号(Class,Protocol,Selector,IMP,…
  3. 由于runtime向dyld绑定了回调,当image加载到内存后,dyld会通知runtime进行处理
  4. runtime接手后调用map_images做解析和处理,接下来load_images中调用call_load_methods方法,遍历所有加载进来的Class,按继承层级依次调用Class的load方法和其Category的load方法
整个事件由dyld主导,完成运行环境的初始化后,配合ImageLoader将二进制文件按格式加载到内存,
动态链接依赖库,并由runtime负责加载成objc定义的结构,所有初始化工作结束后,dyld调用真正的main函数。

0 0
原创粉丝点击