.cpp(c plus plus/c++)单元文件即c++体系下的单元文件。
dyld(the dynamic link editor)是苹果体系的动态链接器,是苹果体系的操作系统重要组成部分,在系统内核做好程序准备相关的工作之后,接下来触发dyld动态链接器即由dyld负责余下的业务工作的处理分析响应反馈。动态链接编译器是开源的,动态链接编译器相关涉及到的源代码苹果官方对外公开。任何人可以通过苹果官网下载动态链接编译器的源码自己来阅读理解底层运作方式,了解系统加载动态库的细节。识别:分析并响应回馈。
编译过程
待编译源文件:载入.h、.m、.cpp等源码文件(定义声明、措施执行、c++)
正式编译前预处理:宏替换为某段指令码(供后期正式编译)、删除注释文档、展开头文件、产生.i文件(.i文件是预编译后生成的文件,一般是头文件包含、进行宏替换后生成的i文件)
编译:将.i文件转换为汇编语言,产生.s文件
汇编:将汇编.s文件转换为.o输出端机器码文件,产生.o文件
链接:对.o输出端机器码文件中涉及其他库引用的地方进行正式引用载入,三方库引用载入完成后生成最后的可执行.exe文件
分析dyld源码的加载执行走势流程
dyld::_main主编译函数源码分析
进入dyld::_main主编译函数源码的实现大约600多行,可根据_main主编译函数的返回值进行反推dyld加载流程。在_main主编译函数中主要做几件事情:
【第一步:环境变量配置】:根据环境的状态配置环境变量下相应的条件判断状态值及获取当前运行架构
【第二步:共享缓存解析处理】:检查是否开启了共享缓存及共享缓存是否映射到共享区域,例如UIKit、CoreFoundation等
【第三步:主程序初始化】:调用instantiateFromLoadedImage函数实例化出一个ImageLoader对象
【第四步:插入动态库】:遍历环境变量DYLD_INSERT_LIBRARIES待插入动态库表容器组,调用loadInsertedDylib加载引入
【第五步:link主程序】
【第六步: