+load方法、c++函数、main函数的调用顺序
image.png从打印顺序我们可以看到:
** +load方法 -> c++函数 -> main函数 **
main函数是程序的入口,但它并不是最先执行的,why?
我先来介绍一下app启动被隐藏的过程,这部分我推荐大家看一下《程序员的自我修养》
编译期
- 源文件,<
- 预编译,进行词法分析、语法分析、语义分析,替换宏,删除注释,展开头文件,产生.i文件
- 编译,将.i文件转换为汇编语言,产生.s文件
- 汇编,将代码生成汇编代码 .s
- 目标文件,讲汇编转换为机器码文件也就是我们经常看到的.o文件
- 链接,静态链接器会将目标文件链接生成最终可执行文件
3。
main函数之前,都是有dyld动态链接器去负责的
-
调用dyld start 函数
- 读取macho文件信息,设置虚拟地址偏移量,也就是ASLR,用于重定向
- 调用dyldmain方法
-
配置环境变量,比如一些打印等信息
-
检查共享缓存,map共享缓存
-
主程序初始化,实例化出一个imageLoader对象
-
插入动态库,
-
链接动态库,
-
弱符号的绑定
-
执行初始化方法 libSystem_initializer(libSystem.B.dylib) --> _os_object_init(libdispatch.dylib) --> _objc_init(libobjc.A.dylib)
-
寻找主程序入口即main函数
-
执行初始化方法 会调用nitifiSingle方法 objc_init 方法里 loadImage方法
网友评论