oc- APP编译过程以及启动过程

2019-08-06  本文已影响0人  雨天多久就

简单介绍 - LLVM编译器

苹果使用的是LLVM编译器,LLVM架构设计的非常好,主要分为前端,中间,后端

llvm入门篇

编译过程:

1.预处理

主要处理文件中以#开头的预编译命令 比如宏定义替换,引入的头文件进行内容替换

2.词法分析

将代码分解成一个一个独立的词法符合(Token)

3.语法分析

将词法分析的结果生成对应的抽象语法树,并验证语法的正确性

4.语义分析

对整个语句进行判别是否有问题

5.生成中间代码

编译器前端的产物,生成与机器无关的中间代码。

6.目标代码生成与优化

Optimizer对前端产物进行优化,再交给后端根据不同的机器指令集生成对应的机器代码,生成对应的Mach-O文件

7.对Mach-O,静态文件等进行link,生成可执行文件,写入对应的.app包里
8.拷贝项目中的资源文件到对应的.app包里
9.编译xib和storyboard
10.link xib和storyboard的产物
11.如果有自定义的脚本,执行脚本(Build Phase 里的Run Script 可以设置自定义的脚本)
12.处理info.plist文件(具体处理什么,不太清楚)
13.生成DSYM文件
14.如果有混编swift,就会将swift的标准库拷贝到对应的.app包里(所以混编oc和swift会增大包体积)
15.代码签名

出于安全考虑,为了防止代码被篡改,最后的可执行文件会被codeSign进行签名。app运行的时候会去校验签名

Mach-O简单介绍

Mach-O 是一种用户记录可执行文件、对象代码、共享库、动态加载代码和内存转储的文件格式。

Mach-O文件类型分为:

主要包含三个主要区域:

[图片上传失败...(image-9cc8ea-1581587495399)]

点击APP图标启动过程

内核先加载主程序
Load dylibs

dyld(动态链接器)启动,然后dyld开始递归加载所有的动态库(通过ImageLoader去加载)。

动态库有哪些好处?

Rebase

因为动态库是被加载到随机地址上的,所以要对所有库内部进行地址指针修正

Bind

修改库对外的指针

Objc Runtime

bind操作结束后,会读取二进制文件的DATA段,找到与objc相关的信息,注册objc类,确保selector的唯一性,读取protocol以及category的信息

Initializers初始化

调用objc类的+load函数

调用c++中带有constructor标记的函数

执行main函数
上一篇 下一篇

猜你喜欢

热点阅读