日志3 执行过程,静动态库 dyld加载

93 阅读2分钟

 程序的入口函数都是main.m文件里面的main函数,但是在main函数执行前可以通过+load方法注入代码来进行安全攻防,而+load方法先于main函数执行。因此值得研究

Xcode允许项目四个阶段:

执行过程分解为4个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking).

  • 预编译:处理代码中的# 开头的预编译指令,比如删除#define并展开宏定义,将#include包含的文件插入到该指令位置等(即替换宏,删除注释,展开头文件,产生.i文件)

  • 编译:对预编译处理过的文件进行词法分析、语法分析和语义分析,并进行源代码优化,然后生成汇编代码(即将.i文件转换为汇编语言,产生.s文件)

  • 汇编:通过汇编器将汇编代码转换为机器可以执行的指令,并生成目标文件.o文件

  • 链接:将目标文件链接成可执行文件.这一过程中,链接器将不同的目标文件链接起来,因为不同的目标文件之间可能有相互引用的变量或调用的函数,如我们经常调用Foundation框架和UIKit 框架中的方法和变量,但是这些框架跟我们的代码并不在一个目标文件中,这就需要链接器将它们与我们自己的代码链接起来

静态库

**静态库**是指链接时完整的拷贝到可执行文件,多次使用多次拷贝,造成冗余,使包变的更大

.a.lib都是静态库

动态库是指链接时不复制,程序运行时由系统加在到内存中,供系统调用,系统只需加载一次,多次使用,共用节省内存.

.dylib.framework都是动态库

最终dyld加载流程,如下图所示,图中也诠释了前文中的问题:为什么是load-->Cxx-->main的调用顺序