iOS应用程序加载

  1. 在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加载顺序

    1. __dyld_start(汇编)
    1. uintptr_t start()
    1. 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函数
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容