1)首先加载可执行文件(自身 app 的所有. o 文件集合)
2)然后加载动态链接库 dyld,dyld 是一个专门用来加载动态链接库的库
3)执行从 dyld 开始, dyld 从可执行文件的依赖开始, 递归加载所有的依赖动态链接库
4)动态链接库包括: iOS 中用到的所有系统的 framework, 加载 OC runtime 方法的 libobjec, 系统级别的 libSystem, 例如 libdispatch(GCD)he libsystem_blocks(Block)
5)dyld:the dynamic link editor, 所有动态链接库和我们 App 的静态库. a 和所有类文件编译后. o 文件, 最终都由 dyld 加载到内存的
3 动态链接库库是相对于系统来讲的
4 可执行文件是相对于 App 本身来讲的
5 每个 app 都是以镜像为单位进行加载的
1)镜像 (Mirroring) 是冗余的一种类型, 一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像
2)镜像是一种文件存储形式, 可以把许多文件做成一个镜像文件
3)每个镜像又都有个 ImageLoader 类来负责加载, 一一对应的关系
6framework 是动态链接库和相应资源包含在一起的一个文件结构
7 系统使用动态链接库的好处
1)代码共用: 很多程序都动态链接了这些 lib, 但它们在内存和磁盘中只有一份
2)易于维护: 由于被依赖的 lib 是程序执行时才链接的, 所以这些很容易更新, 只要保证在程序执行之前, 获取最新 lib 即可
3)减少可执行文件体积: 相比静态链接, 动态链接在编译时不需要打进去, 所有可执行文件的体积要小很多
8 动态链接库的加载步骤具体分为 5 步
1)load dylibs image 读取库镜像文件
2)Rebase image 重定位镜像
3)Bind image 组装镜像
4)Objc setup 设置对象
5)initializers 初始化
9 第一步又分为下面 6 个过程
1)分析所依赖的动态库
2)找到动态库的 mach-o 文件(我们知道 Windows 下的文件都是 PE 文件, 同样在 OS X 和 iOS 中可执行文件是 Mach-o 格式的)
3)打开文件
4)验证文件
5)在系统核心注册文件签名
6)对动态库的每一个 segment 调用 mmap()
108.2,8.3
由于 ASLR(address apace layout randomization)的存在, 可执行文件和动态链接库在虚拟内存中的加载地址每次启动都不固定, 所以需要这两步俩修复镜像中的资源地址, 来纸箱正确的地址
1)rabase 修复的是指当前镜像内存的资源指针; bind 指向的是镜像外部的资源指针
2)rebase 步骤先进行, 需要把镜像读入内存, 并以 page 为单位进行加密验证, 保证不会被篡改; bind 在其后进行, 由于要查询表符号表, 来指向镜像的资源;
118.4
来源: http://www.jianshu.com/p/e6a80ebaf6bb