美文网首页
iOS应用程序加载

iOS应用程序加载

作者: 叔简 | 来源:发表于2022-03-30 20:20 被阅读0次
    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函数

    相关文章

      网友评论

          本文标题:iOS应用程序加载

          本文链接:https://www.haomeiwen.com/subject/nnywjrtx.html