iOS 底层探索篇 —— dyld加载流程(上)

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

1. 应用程序加载

1.1库

每个程序的运行都会依赖一些基础的库,比如说UIKitCoreFoundation等,库是一些可执行的二进制文件,能被操作系统加载到内存中。库有两种形式,就是静态库(.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被编译

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值