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然后再替换替身就行了
- 减少可执行文件体积:相比静态链接,可执行文件的体积要小很多
动态连接器充当ImageLoader()和runtime的协调者,首先将程序依赖的动态链接库递归加载进内存,通过初始化runtime,当有新的image文件(包含了我们的类、方法等各种符号)加载内存后,dyld回调runtime,把这些类、方法等各种符号交由runtime管理,此后runtime的那些方法(动态添加Class、方法混合等等才能生效)
整个过程如下:
- dyld开始将程序二进制文件初始化
- 交由ImageLoader读取image,其中包含了我们的类、方法等各种符号(Class,Protocol,Selector,IMP,…)
- 由于runtime向dyld绑定了回调,当image加载到内存后,dyld会通知runtime进行处理
- runtime接手后调用map_images做解析和处理,接下来load_images中调用call_load_methods方法,遍历所有加载进来的Class,按继承层级依次调用Class的load方法和其Category的load方法
动态链接依赖库,并由runtime负责加载成objc定义的结构,所有初始化工作结束后,dyld调用真正的main函数。
0 0
- IOS main函数运行前的dydl动态链接库
- main函数执行前-C/C++运行时库剖析
- main函数的运行
- main函数前的秘密
- iOS的main函数
- Main和WinMain函数执行前,系统进行的运行时裤的执行代码分析
- java.library.path 在java main函数运行前的设置
- IOS程序启动时main函数前执行的部分-load方法和静态函数
- 单元测试与main前运行函数__attribute__((constructor))关键字
- C - main函数前的准备工作
- 链接期和运行期的动态链接库
- 查看正在运行的动态链接的程序中,某个动态库中函数的虚拟地址
- 运行过程中链接动态链接库与编译过程中链接动态库的区别
- 运行过程中链接动态链接库与编译过程中链接动态库的区别
- JVM的动态agent机制:在main函数启动之后运行agent
- 证明静态函数在main函数运行前就运行了
- 动态链接库导出函数的若干问题
- 调用特定动态链接库的函数
- 用Notepad++编辑tnsnames.ora结果保存出错:请检查文件是否在别的程序中打开
- WPF C# 字符串读写文件
- Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近期任务)与正在运行的程序
- SQL基本操作
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- IOS main函数运行前的dydl动态链接库
- 未发现软件包ncurses
- 欢迎使用CSDN-markdown编辑器
- 位(Bit)、字节(Byte)、字(Word)
- C++中虚析构函数
- javaWeb中在servlet中response下载图片
- Dubbo架构设计详解
- Android基础-03
- Qt移植之tslib