一、序言

作为iOSer,我们天天在xcode上写代码,然后打包发布或者测试,可曾想过代码是如何到内存种的?app是如何从点击图标到整个程序运行的呢?现在我们来源码资本探究一下。

二、库

什么是库?库就是能够被系统加载到内存中的可执行的架构图模板二进制文件xcode怎么编写c语言,库有架构师证书这种形式: 静态库(.a .o等)和动态库(.framework .so .dylib等)

1、动态库和静态库的区架构工程师

我们梳理一下库的加载过程,首先我们的代码(.h .m .cpp .swift等)经过预编译、编译成汇编,然后链接装载生成可执行文件,大致流程图如下:

iOS应用程序加载的原理

1.1、静态库

链接时,静架构态库会被挨个挨个完整地装载到可执行文件中,被多次使用就有多份冗余拷贝,如图:

iOS应用程序加载的原理

架构师工资中会很明显的有重复的库,这样就会浪费很多性能。

1.2、动态库

动态库在加载时才进行链接,比如加载到某个节点发现需要某一个库时并不是直接加载,而是共享这个动态库。相比于静态库,动态库会被共用,这xcode是什么软件样会节省更多的空间和时间。加载的大致流程如下所示:

iOS应用程序加载的原理

三、链接器

库是如源码是什么意思何加载到内存种的呢?这就需要一个非常重要的东西了dyld

1、App的启动入口

App是如何启动的呢?我们都知道所有程序的入口都是main函数,那架构工程师么我们来验证一下。首先创建一个空的iOS项目,并在main函数上打个断点,执行程序,如图:

iOS应用程序加载的原理
很容易发现在main之前有个start_sim,我们下个下个符号断点start,再次运行程序,如图:

iOS应用程序加载的原理
很遗憾还是在这里,好像失去二进制转十六进制公式了方向。但是经验告诉我们有个方法会在main之前执行,对,就是load方法,我们随便添加个load并断点,如图:

iOS应用程序加载的原理
运行起来,如图:

iOS应用程序加载的原理
山穷水复疑无路,柳暗花明又一村。赶紧查看一下堆栈信息,如图:

iOS应用程序加载的原理
好像这Xcode里才是我们程序的起点。

2、APP的启动流二进制转八进制

刚刚我们找到了APP的启动入口,那么从启动到main函数这个中间经历了什么呢?干了什么逆向行驶事情呢?我们需要到dyld源码中寻找,打二进制转八进制dyld的源二进制转八进制码,搜索_dyld_st架构师证书art(由于源码编译依赖太多就没有流程可以跟踪。还有因系统版本Xcode打开dyld源码闪退源码的问题,可以将dyld的源码拖入到新建的工程中,不要copy,可以避免闪退),如下所示:

iOS应用程序加载的原理

全在深奥的汇编中,二进制这不要紧,因为这里都写的注释。我们很容易发现所有的架构类型中都有call dyldbootstrap::start(app_mh, arg架构工程师c, argv二进制怎么算, dyld_mh, &startGlue)这个注释,直接搜索dyldbootstrap:: 没有任何结果,这是c++语法,要先找到命名拉达xcode空间dyldbootst架构图怎么做wordrap,如架构图图:

iOS应用程序加载的原理
然后再搜索start(,如图所示:

iOS应用程序加载的原理
这里返回的是个dyld::_main(我们再次去找实现源码资本,同样先找命名空间,在找函数,如图:

iOS应用程序加载的原理
131架构图怎么做word80条结果,太多了,过滤一下,搜索namespace dyld {xcode怎么保存cpp如图:

iOS应用程序加载的原理
锐减到14条结果,挨个搜索_main(,找到了实现如下所示:

iOS应用程序加载的原理
源码编辑器下载长,收起来一看近1000行代码,如图:

iOS应用程序加载的原理

为了找准核心代码,我们可以直接渠道最后查看返回值,然后根据返回值找关键的东西,如图:

iOS应用程序加载的原理
返回值是result,那么找出result赋值相关的代码,如图:

iOS应用程序加载的原理

iOS应用程序加载的原理
fake_main返回值是0,如图:

iOS应用程序加载的原理

所以可以忽略不看,那么result的值很大可能与二进制转化为十进制sMainExecutable相关。接下来找s二进制计算器Mai逆向思维案例100个nExecutab架构图怎么做wordle相关的东西,如图:

iOS应用程序加载的原理
这里的绑定可以说明sMainE源码编程器xecutable就是我们需要找的代码。所以我们要看sMa源码编辑器下载inExecutable的初逆向思维的例子始化,如图:

iOS应用程序加载的原理
然后进入到instantiateFromLoadedImage方法中,如图:

iOS应用程序加载的原理
大概意思是为已经映射到可执行文件中的对象创建一个ImageLoader*,然后往下,如图:

iOS应用程序加载的原理
加载动态库,然后如图:

iOS应用程序加载的原理
linxcode怎么设置成中文k主程序,再然后:

iOS应用程序加载的原理
link库。在所Xcode有镜像文件源码编辑器下载都链接完毕之后进逆向行驶扣几分罚款多少钱行弱引用绑定符号表:

iOS应用程序加载的原理
然后初始化执行主程序:

iOS应用程序加载的原理
具体代码如图:

iOS应用程序加载的原理
即拿到各个镜像文件,然后runInitializers,如图:

iOS应用程序加载的原理
其中processInit二进制八进制十进制十六进制转换ializers代码如下:

iOS应用程序加载的原理
第一个for大概意思架构图就是对镜像文件列二进制表中的镜像文件递归初始化,第二个for是继续初始化向上以来的文件。具体的初始在recursiveInitializationxcode怎么保存cpp,继续进去查看,如图:

iOS应用程序加载的原理
里面是逆向思维案例100个try catch,那么我们逆向思维训练500题从try中查找即可,如图:

iOS应用程序加载的原理
再继续看notifySingle,如图:

iOS应用程序加载的原理
notifySingle定义的二进制计算器是一二进制转化为十进制个函数,接下来来就需要找到他赋值的地源码编程器方,如图:

iOS应用程序加载的原理
在然后实现的地方架构图,如图:

iOS应用程序加载的原理
接下来看1112行的sNotifyObjCInit,搜索到定义和赋值如下:

iOS应用程序加载的原理
iOS应用程序加载的原理
sNotifyOb源码编辑器手机版下载jCInit的赋值源于registerObjCNotifiers函数的第二个参数,所以继续搜索registerObjCNotifiers的调用,如图:

iOS应用程序加载的原理
继续搜索,如图:

iOS应用程序加载的原理
貌似没有找到调用,线索断了?放松一下。

3、从架构图模板_objc_init开始的逆向推导

打开objc源码搜索registerObjCNotifiers,如图:

iOS应用程序加载的原理
发现在_objc_i二进制nit有调用registerObjCNotifiers,且objc源码是可编译的,断点伺候,如图:
iOS应用程序加载的原理
点击_os_object_init,如图架构工程师
iOS应用程序加载的原理
libdispatch.dylib库中的_os_object_init有调用_objc_init,所以我们去libdispatch.dylib查找_os_object_init,如图:

iOS应用程序加载的原理
果真在_os逆向思维案例100个_object_逆向思维案例100个init有调用_objc_init,继续往下找,如图:
iOS应用程序加载的原理
在同一个库中的libdis逆向pa逆向tch_init中找到了_os_object_init的调用。那么libdispatch_init的调用是在哪里呢?当前库也搜索不到,所以我们回到objc源码中,在控制台输入bt查看堆栈信息,如图:

iOS应用程序加载的原理
libSystem.B.dy二进制八进制十进制十六进制转换lib中有调用,那么我们去libSystem.B.dylib查找libdispatch_init,如图:

iOS应用程序加载的原理
libSy源码时代stem库的libSystem_initi二进制alizer调用了libdispatch_init,继续搜索li逆向行驶扣几分罚款多少钱bSystem_initializer并没有找到的调用逆向行驶扣几分罚款多少钱,再看堆栈架构图信息,在dyld中的doModInitFunctions(ImageLoader::LinkContext const&)调用架构图怎么做word,所以回到dyld中搜索ImageLo二进制转八进制adexcode怎么设置成中文rMach架构师O::doModInitFunctions,如图:

iOS应用程序加载的原理
根据注释判断出该方法是加载libSystem的。其中funclibSys架构图tem_initializer,根据参数判断。然后查找doModInitFunctions的调用,如图:

iOS应用程序加载的原理
再查找doInitialization的调用处,如图:

iOS应用程序加载的原理
再次回到了recursiveIni逆向思维训练500题tialization中,大概理清楚了通知注册的方法,由于目前xcode直接打开dyld二进制转换器库会闪退,影响部分分析,请各位大神多多指导。