前语:作为一个开发者,如果你了解很多言语的开发,你会发现大部分言语的一个共同点,main函数。咱们都是从main函数开端,去关注程序的编写、编译和履行进程。main函数之前,体系有没有做一些其他的作业,做了哪些作业呢,一起来看看?

一、使用发动剖析

1、程序从编写到履行的进程

初探dyld动态链接器流程对iOS又精进了一步

1、代码怎样加载到内存?
2、静态库、动态库怎样加载到内存?
3、objc_init -> objc 在哪里履行的?

咱们可以想一下以上的进程是怎样产生的,各个环节都是怎样加载到内存的?

2、静态库和动态库

咱们常常在项目中运用静态库和动态库,其间体系供给的UIKit,Foundation库,WebKit库等等,这些是动态库,比如咱们常常运用的自定义的静态Framework,.a文件,就是归于静态库。那么,静态库和动态库是怎样区别的?

初探dyld动态链接器流程对iOS又精进了一步

●动态库形式:.dylib和.framework
●静态库形式:.a和.framework

如上图所示,咱们剖析:
1、静态库:链接时,静态库会被完整地复制到可履行文件中,被多次运用就有多份冗余拷贝
2、动态库:链接时不复制,程序运转时由体系动态加载到内存,供程序调用,体系只加载一次,多个程序共用,节省内存
但是,体系的动态库怎样加载到内存呢?经过什么方法?这儿就用到了一个东西dyld动态链接器。

3、动态链接器

3.1 动态链接器的作业进程

初探dyld动态链接器流程对iOS又精进了一步

上面是dyld的加载作业流程图,经过它首要进行了动态库的注册和动态库的加载进程。

二、dyld进程初探

●经过上面原理的整体剖析后,咱们接下来就进行使用程序代码履行逻辑的剖析

初探dyld动态链接器流程对iOS又精进了一步

在main函数的进口方位,加上断点,运转后程序停在断点方位,经过堆栈打印(bt为lldb堆栈打印命令),发现程序是溃散在了lldb中,这儿咱们并不能获取更多信息去盯梢。
于是,咱们经过编程经历,想到了在程序履行main函数之前,会提前履行load函数的加载,那么就做一下测验,在ViewController中假设load函数,并添加断点,运转程序。

初探dyld动态链接器流程对iOS又精进了一步

结果很顺利,咱们断点停在了ViewController的load方法,经过堆栈打印,发现了关于dyld的一系列函数进程。下面就引出咱们探究的主题:dyld(动态链接器),咱们的函数追寻,也将依照这样一个次序去进行!

1、dyld简介

dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作体系一个重要组成部分,在体系内核做好程序准备作业之后,交由dyld担任余下的作业。而且它是开源的,任何人可以经过苹果官网下载它的源码来阅读了解它的运作方法,了解体系加载动态库的细节。

2、dyld的源码

苹果官方 dyld库 下载地址

初探dyld动态链接器流程对iOS又精进了一步

这儿咱们挑选最新的版别进行研究,技能嘛,总要与时俱进,下载完这些,先不急,先来一个苹果的官方视频介绍,关于dyld2,到dyld3进程的更新、特性,然后咱们鄙人一章介绍 dyld 的探究进程。

3、苹果官方关于dyld的介绍视频

App Startup Time: Past, Present, and Future https://developer.apple.com/videos/play/wwdc2017/413/

三、总结

咱们这儿介绍了使用发动进程的大约进程剖析,首要有:
1、动态库与静态库的概念和了解
2、dyld的概念和链接进程解析
3、咱们是如何知道程序是在main函数之前进入了dyld
关于dyld的详细履行进程,下一节独自讲解!

链接:iOS使用发动流程剖析之dyld源码解析