iOS底层-应用程序加载

背景

  • 我们一直在用手机玩App但App启动都做了什么呢?App启动到main函数中间都做了什么?
  • 我们一直写代码,代码又是如何写入内存中的呢?
  • 我们导入的动/静态库怎么加载到内存的?
  • objc_init怎么来的?我们前面探索了那么多objc源码它怎么启动的呢?
  • dyld到主程序main的过程做了什么?
  • dyld2 和 dyld3的区别?

准备

  • 可编译的objc4工程
  • dyld源码
  • libdispatch、libsystem源码

App加载原理

请添加图片描述

库:可执行的二进制文件能够被加载到内存中
请添加图片描述

  • 静态库:(.a/.lib) 静态链接 优点:编译速度快 缺点:包体积变大
  • 动态库:(.so/.dll/.framwork)动态链接 优点:共享相同库,优化内存空间和包大小。缺点:编译速度慢
  • 可执行文件:放在终端能够运行起来
    动静态库区别主要在链接方式不一样,以空间换时间和以时间换空间的区别,没有好与坏选择合适的方式保持动态平衡

动态链接器(dyld)

请添加图片描述

dyld流程源码分析:

我们从程序运行汇编调试看到dyld_start是dyld的方法
在这里插入图片描述

下面我们来分析dyld动态链接器源码程序执行过程:
在这里插入图片描述
call dyldbootstrap::start(app_mh, argc, argv, dyld_mh, &startGlue)
在这里插入图片描述
然后找里面有个_main函数,此为dyld内部函数跟工程的main不同,_main函数里面通过返回result跟sMainExecutable有关
在这里插入图片描述
而sMainExecutable是instantiateFromLoadedImage的函数调用
在这里插入图片描述
在这里插入图片描述
instantiateMainExecutable初始化主程序并执行:
在这里插入图片描述
经过探索到单个镜像文件加载_dyld_objc_notify_register:
在这里插入图片描述
跟libobjc.dylib的objc_init走的同一个方法:
在这里插入图片描述

dyld到主程序main过程

lldb到objc源码中的objc_init,使用bt,逆向推导 :
doinitialization-> doModInitFunctions(dyld) -> libSystem.B.dyliblibSystem_initializer:->libdispatch.dyliblibdispatch_init:->_os_object_init(libdispatch.dylib) -> _objc_init(libobjc)

  • 小节汇总-> 首先要libSystem系统库先加载,然后libdispatch线程库加载

doinitialization和context.notifySingle关系

_dyld_objc_notify_register(&map_images, load_images, unmap_image);
map_images:关联重要内容数据
在这里插入图片描述
然后进入_dyld_objc_notify_register:
在这里插入图片描述
找到setObjCNotifiers函数并进入:
在这里插入图片描述
里面有三个重要参数:
mapped,init,unmapped

doInitialization初始化赋值
在这里插入图片描述
在这里插入图片描述

然后赋值_dyld_objc_notify_register-> registerObjCNotifiers:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

请添加图片描述

map_images 和 load_images:

map_images和load_images是dyld和objc沟通的过程

map load - map()
notifySingle : load()

在这里插入图片描述
objc的load_images会在dyld的registerObjCNotifiers:开始调用
在这里插入图片描述

请添加图片描述

dyld流程分析图示:

我们可了解dyld流程的App加载过程
请添加图片描述

总结分析

  • 感受:有时候内容不重要,分析问题和内容的能力很重要
  • 通过符号断点dyld3是iOS使用的框架(WWDC2017)
  • 我们通过探索发现objc_init做程序初始化,而且里面有很多函数初始化,那它里面都做了什么?若感兴趣请移步:iOS底层-类的加载原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☆MOON

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值