前言:从这篇起我们探索下应用程序的加载流程~
一、库
1.库:可执行的二进制文件,能够被系统加载到内存中。
常规的就是静态库(.a等),动态库(.dylib等)。
静态链接:可能重复加载
动态链接:对内存有优化
2.可执行文件拖入终端可运行。
二、库的加载
1.先认识下dyld~
dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作系统一个重要组成部分,在系统内核做好程序准备工作之后,交由dyld负责余下的工作。
2.创建一个新iOS工程,在main函数开始的地方打个断点,运行看看
发现堆栈是从start开始的,点击查看start
是来自libdyld.dylib的start。
打个符号断点start后发现并不能断住start,那么在main函数之前iOS工程会执行load方法,在load方法里打个断点看看。
断住了,再来lldb中bt命令查看下堆栈
可以看出是从dyld库开始的 ,然后load_images(镜像文件),就调起了load方法。接下来探索下dyld的加载流程,以及如何走到load_images加载镜像文件的~
三、dyld探索
dyld852源码打开,下载地址:传送门
打开dyld源码工程,全局搜索dyld_start
可以看到调用的是dyldbootstrap::start