iOS应用程序加载
2022-03-30 本文已影响0人
叔简
-
在main()函数之前,在一般情况下,我们都会将main()函数作为程序入口,在main函数之前,程序所经历的事情
image.png
- 静态库:链接时会被完整的复制到可执行文件中,所以如果两个程序都用了某个静态库,那么每个二进制文件中,都会包含这个静态库文件
- 动态库:链接时不复制,在程序启动后用动态加载,然后再决议符号,所以理论上动态库只用存在一份,好多个程序都可以链接到这个动态库上面,达到节省内存作用,还有另一个好处,由于动态库并不绑定到可执行程序上,所以我们想升级这个动态库就很容易
动态链接库
- iOS中用到的所有系统framework
- 加载OC runtime方法libobjc
-
系统级别的libSystem,例如libdispatch(GCD)和libSystem_blocks(Block)
这些放在内存中的共享库文件会在app启动后交给dyld动态链接器来进行链接管理,链接流程如下:
image.png
main()函数之前
- 首先加载load函数
- 加载dyld,dyld_start来实现加载
- main()函数:加载共享系统动态库,加载依赖的动态库,链接动态库,初始化主程序,返回主程序main()函数地址
- 加载共享缓存
- 生成ImageLoader对象
- 加载所有插入的库loadInsertDylib
- 链接主程序
- 执行初始化方法initializeMainExecutable
dyld加载顺序
- __dyld_start(汇编)
- uintptr_t start()
- uintptr_t _main()
- 3.1.配置上下文
- 3.2.处理环境变量
- 3.3.加载共享缓存
- 3.4.将dyld加入UUID列表
- 3.5.加载所有image
3.5.1.为可执行文件实例化imageLoader
3.5.2.为主可执行文件创建image
3.5.3.加载任何插入动态库
3.5.4.链接动态库 - 3.6 初始化所有程序
3.6.1.遍历初始化image
3.6.2.通知image初始化完成
3.6.3初始化libSystem
3.6.4.初始化libdispatch
3.6.5.初始化libobjc - 3.7进入主程序main函数