前言:做为一个开发者,若是你熟悉不少语言的开发,你会发现大部分语言的一个共同点,main函数。咱们都是从main函数开始,去关注程序的编写、编译和执行过程。main函数以前,系统有没有作一些其余的工做,作了哪些工做呢,一块儿来看看?web
一、代码怎么加载到内存?编程
二、静态库、动态库怎么加载到内存?markdown
三、objc_init -> objc 在哪里执行的?app
咱们能够想一下以上的过程是怎么发生的,各个环节都是怎么加载到内存的?ide
咱们常常在项目中使用静态库和动态库,其中系统提供的UIKit,Foundation库,WebKit库等等,这些是动态库,好比咱们常常使用的自定义的静态Framework,.a文件,就是属于静态库。那么,静态库和动态库是怎么区分的?函数
动态库形式:.dylib和.framework工具
静态库形式:.a和.frameworkoop
如上图所示,咱们分析:post
一、静态库:连接时,静态库会被完整地复制到可执行文件中,被屡次使用就有多份冗余拷贝spa
二、动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
可是,系统的动态库怎么加载到内存呢?经过什么方式?这里就用到了一个工具dyld动态连接器。
上面是dyld的加载工做流程图,经过它主要进行了动态库的注册和动态库的加载过程。
在main函数的入口位置,加上断点,运行后程序停在断点位置,通过堆栈打印(bt为lldb堆栈打印命令),发现程序是崩溃在了lldb中,这里咱们并不能获取更多信息去跟踪。
因而,咱们经过编程经验,想到了在程序执行main函数以前,会提早执行load函数的加载,那么就作一下尝试,在ViewController中假如load函数,并添加断点,运行程序。
结果很顺利,咱们断点停在了ViewController的load方法,经过堆栈打印,发现了关于dyld的一系列函数过程。下面就引出咱们探究的主题:dyld(动态连接器),咱们的函数追踪,也将按照这样一个顺序去进行!
dyld(the dynamic link editor)是苹果的动态连接器,是苹果操做系统一个重要组成部分,在系统内核作好程序准备工做以后,交由dyld负责余下的工做。并且它是开源的,任何人能够经过苹果官网下载它的源码来阅读理解它的运做方式,了解系统加载动态库的细节。
这里咱们选择最新的版本进行研究,技术嘛,总要与时俱进,下载完这些,先不急,先来一个苹果的官方视频介绍,关于dyld2,到dyld3过程的更新、特性,而后咱们在下一章介绍 dyld 的探究过程。
App Startup Time: Past, Present, and Future https://developer.apple.com/videos/play/wwdc2017/413/
咱们这里介绍了应用启动过程的大概过程分析,主要有:
一、动态库与静态库的概念和理解
二、dyld的概念和连接过程解析
三、咱们是如何知道程序是在main函数以前进入了dyld
关于dyld的详细执行过程,下一节单独讲解!
🌺更多内容期待与你一块儿分享,喜欢的话,点个赞点个关注,持续为您创造好的内容。