iOS 底层探索篇 —— dyld加载流程(上)
1. 应用程序加载
1.1库
每个程序的运行都会依赖一些基础的库,比如说UIKit,CoreFoundation等,库是一些可执行的二进制文件,能被操作系统加载到内存中。库有两种形式,就是静态库(.a , .lib)和动态库(.so , .dll),两个库主要表现在链接的区别。
静态库:静态库
在编译时加载,在链接时会完整的复制到可执行文件中,此时的静态库就不会在改变了,因为它是编译时被直接拷贝一份,复制到目标程序里的
优点:编译后的执行文件不需要外部库的支持,直接就能使用。缺点:有多个app使用就会被复制多份,不能共享且占用更多冗余内存。所有的函数都在库中,因此当修改函数时需要重新编译。
动态库:程序
编译时并不会链接到目标程序中,目标程序只会存储指向动态库的引用,在程序运行时由系统动态加载到内存。
优点:库是动态的,运行时才载入,因此修改库中函数时,不需要重新编译。同一个库可以被多个程序使用,内存只加载一次,节省内存空间。因为不需要拷贝至目标程序中,所以不会影响目标程序的体积,所以app体积相对静态库来说是减少的。缺点:动态库是运行时由系统加载到内存,如果环境缺少库或者库的版本不正确,那么程序就会无法运行。并且因为在编译过程中没有整合到目标代码中,只有执行到该函数时候才去调用库中的函数,所以首次加载比较耗时。

1.2 编译过程
其中编译过程如下图所示,主要分为以下几步:
源文件:载入.h、.m、.cpp等文件
预编译:替换宏,删除注释,展开头文件,产生.i文件
编译:编译器将.i文件转换为汇编语言,产生.s文件
汇编:将汇编文件转换为机器码文件,产生.o文件
链接:对.o文件中引用其他库的地方进行引用,生成最后的可执行文件

1.3 DYLD(链接器)
介绍完了库,那么库是怎么加载到内存里的呢?这就要说到一个非常牛逼且重要的东西:DYLD(链接器)。
DYLD(the dynamic link editor)是苹果的动态链接器,是苹果操作系统的重要组成部分,在app被编译

本文详细探讨了iOS应用程序的加载过程,重点解析了dyld动态链接器的角色和工作原理。从库的静态与动态类型,到编译过程,再到dyld如何加载库和启动APP的流程。通过对dyld源码的探索,揭示了dyld_bootstrap::start方法的调用,以及dyld::_main函数中对镜像文件的初始化和依赖递归初始化的过程。文章深入浅出地阐述了_objc_init和doModInitFunctions等关键步骤,为理解iOS程序启动和运行时机制提供了宝贵的知识。
最低0.47元/天 解锁文章
343

被折叠的 条评论
为什么被折叠?



