APP 启动流程 和 APP 编译流程

APP 启动流程

App启动后,首先,系统内核(Kernel)建立一个进程。 其次,加载可执行文件。(可执行文件是指Mach-O格式的文件,也就是App中全部.o文件的集合体)这时,能获取到dyld(dyld是苹果的动态连接器)的路径。 而后,加载dyld,主要分为4步: 1 . load dylibs:这一阶段dyld会分析应用依赖的dylib,找到其mach-o文件,打开和读取这些文件并验证其有效性,接着会找到代码签名注册到内核,最后对dylib的每个segment调用mmap()。 2 . rebase/bind:进行rebase指针调整和bind符号绑定。 3 . ObjC setup:runtime运行时初始化。包括ObjC相关Class的注册、category注册、selector惟一性检查等。 4 . Initializers:调用每一个ObjC类与分类的+load方法,调用attribute((constructor))修饰的函数、建立C++静态全局变量。后端

APP 编译流程

www.jianshu.com/p/d94696155…markdown

编译前段 Clang

  1. 预处理阶段:宏的展开,头文件的导入
  2. 编译阶段 ①词法分析 ②语法分析(抽象语法树AST ) ③静态分析,会对语法树进行错误,如出现方法被调用可是未定义,定义可是未使用的变量、以及类型检查等(AST -> IR) ④生成中间代码IR

下面进入编译器后端 LLVM

  1. 生成汇编代码 汇编器LLVM会将汇编码转为机器码。此时的代码就是.o文件,即二进制文件
  2. 运行时连接 : 链接器把编译产生的.o文件和(dylib,a,tbd)文件,生成一个mach-o文件。mach-o文件级可执行文件。编译过程所有结束,生成了可执行文件Mach-O

预处理:Clang会预处理你的代码,好比把宏嵌入到对应的位置、注释被删除,条件编译被处理 词法分析:词法分析器读入源文件的字符流,将他们组织称有意义的词素(lexeme)序列,对于每一个词素,词法分析器产生词法单元(token)做为输出。而且会用Loc来记录位置。 语法分析:这一步是把词法分析生成的标记流,解析成一个抽象语法树(abstract syntax tree -- AST),一样地,在这里面每一节点也都标记了其在源码中的位置。 AST 是抽象语法树,结构上比代码更精简,遍历起来更快,因此使用 AST 可以更快速地进行静态检查。 静态分析:把源码转化为抽象语法树以后,编译器就能够对这个树进行静态分析处理。静态分析会对代码进行错误检查,如出现方法被调用可是未定义、定义可是未使用的变量等,以此提升代码质量。固然,还能够经过使用 Xcode 自带的静态分析工具(Product -> Analyze)进行手动分析。最后 AST 会生成 IR,IR 是一种更接近机器码的语言,区别在于和平台无关,经过 IR 能够生成多份适合不一样平台的机器码。 静态分析的阶段会进行类型检查,好比给属性设置一个与其自身类型不相符的对象,编译器会给出一个可能使用不正确的警告。在此阶段也会检查时候有未使用过的变量等。 中间代码生成和优化:此阶段LLVM 会对代码进行编译优化,例如针对全局变量优化、循环优化、尾递归优化等,最后输出汇编代码xx.ll文件。 生成汇编代码: 汇编器LLVM会将汇编码转为机器码。此时的代码就是.o文件,即二进制文件。 连接:链接器把编译产生的.o文件和(dylib,a,tbd)文件,生成一个mach-o文件。mach-o文件级可执行文件。编译过程所有结束,生成了可执行文件Mach-O函数

相关文章
相关标签/搜索