iOS引用程序加载流程-dyld
一、应用程序加载原理
在分析dyld加载应用程序之前,先清楚以下基本概念。
库:可执行的二进制文件,可以被系统加载到内存。库分为静态库和动态库,动态和静态库的区别是链接的区别。
编译过程
image
源文件->预编译->编译->汇编->链接->可执行文件(MachO格式)。
动态库:动态链接。只会存在一份,在内存中共享。减少了包的体积大小。这里有完全动态特性的就是系统的动态库了。
静态库:静态链接。静态库在装载的时候会重复,浪费了空间。
那么这些库是怎么加载到内存中的呢?
是通过dyld动态链接器加载到内存中的。整个过程大概如下:
image
dyld(the dynamic link editor)动态链接器,是苹果操作系统一个重要组成部分,在系统内核做好程序准备工作之后交由dyld负责余下的工作。
这篇文章将详细分析整个dyld加载过程。
二、dyld 初探
既然是dyld加载的库,那么在加载完成后肯定会进入main函数,那么在main函数上打个断点看下调用:
image
可以看到是libdyld.dylib start:调用的main函数。给start下个符号断点并没有进入断点。那么证明在底层的符号不是start。实现一个+ load方法打个断点发现如下调用栈:
image
可以看到是dyld _dyld_start发起的调用。opensoure上直接下载dyld-852源码。
搜索_dyld_start发现这个入口是在汇编中,其中主要是调用了dyldbootstrap::start:
image
最终跳转了返回的LC_MAIN。
也可以通过断点查看汇编调用确定:
image
dyldbootstrap是c++的命名空间,start是其中的函数。搜索后发现dyldbootstrap::start在dyldInitialization.cpp中,这也就是函数开始的地方。接下来结合源码分析怎么从start调用到load和main方法,以及dyld是如何加载images的。
总结
dyld调用流程
image
核心点文字总结
image