iOS-应用安全07 DYLD

203 阅读1分钟

dyld概述

dyld加载所有的库和可执行文件

dyld 加载流程

  • 程序由_dyld_start函数开始
  • 进入dyld::_main函数
    • 配置一些环境变量(DYLD_PRINT_ENV:打印魂晶变量;DYLD_PRINT_OPTS:machO的地址)
    • 加载共享缓存库:UIKit、Foundation(一开始就判断是否被禁用,iOS无法被禁用的)
    • 加载实例化主程序
    • 加载动态库
    • 连接主程序
    • 最关键的地方:初始化方法
      • 经过过一系列的初始化调用notifySingle函数
        • 该函数会执行一个回调
        • 通过断点调试:进入_objc_init初始化
          • 内部有map_images、load_images(内部调用load方法)
      • doModinitFunctions函数
        • 内部调用带__atrribute__((constuctor)) 的c函数
      • 返回主程序的函数入口,调用主程序的main函数

atrribute((constuctor)) 函数例子

__atrribute__((constuctor)) void func1 {
    printf("构造函数1");
}

方法的调用顺序

load --- c++构造函数 --- main

image加载顺序

mage加载顺序 共享缓存(UIKit、foundation ...) --- 动态插入的库 --- 三方库 --- 程序

总结