IOS程序启动时main函数前执行的部分-load方法和静态函数

原创 2016年08月28日 19:03:17

1 load部分

1.1 调用堆栈

    frame #0: MyApp`+[XXX load]
    frame #1: libobjc.A.dylib`call_load_methods + 680
    frame #2: libobjc.A.dylib`load_images + 144
    frame #3: dyld`dyld::notifySingle() + 312
    frame #4: dyld`ImageLoader::recursiveInitialization() + 344
    frame #5: dyld`ImageLoader::recursiveInitialization() + 260
    frame #6: dyld`ImageLoader::processInitializers() + 144
    frame #7: dyld`ImageLoader::runInitializers() + 84
    frame #8: dyld`dyld::initializeMainExecutable() + 184
    frame #9: dyld`dyld::_main() + 3784
    frame #10: dyld`_dyld_start + 68


1.2 加载时机


dyld调到obc库,objc库调用各个load方法。
objc库调用load过程:_getObjc2NonlazyClassList获取所有类列表,判断load实现,生成一份指针列表,然后挨个调用。


详细参考:
https://zhuanlan.zhihu.com/p/20816991


实际发现_getObjc2NonlazyClassList获取到的就是一堆实现了load方法的类,这些类都保存在Section(_DATA,_obj_nlclslist)。(MachOView工具)


dyld源码分析参考:
http://turingh.github.io/2016/03/01/dyld%E4%B8%ADmacho%E5%8A%A0%E8%BD%BD%E7%9A%84%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90/
https://github.com/turingH/dyld_soucecode_analysis
http://opensource.apple.com/tarballs/dyld/dyld-360.18.tar.gz


obj库源码参考:
http://opensource.apple.com/tarballs/objc4/


1.3 找出所有实现load方法的OC类

符号断点load找出来;
或者Hopper Disassembler/IDA打开debug版二进制文件,跳到_obj_nlclslist section,可以找到如下列表:
_OBJC_CLASS_$_XXX1
_OBJC_CLASS_$_XXX2
_OBJC_CLASS_$_XXX3
...


2 静态函数部分

2.1 调用堆栈

    frame #0: MyApp`XXXFunction() + 24
    frame #1: dyld`ImageLoaderMachO::doModInitFunctions() + 260
    frame #2: dyld`ImageLoaderMachO::doInitialization() + 36
    frame #3: dyld`ImageLoader::recursiveInitialization() + 368
    frame #4: dyld`ImageLoader::processInitializers() + 144
    frame #5: dyld`ImageLoader::runInitializers() + 84
    frame #6: dyld`dyld::initializeMainExecutable() + 220
    frame #7: dyld`dyld::_main() + 3784
    frame #8: dyld`_dyld_start + 68

2.2 加载时机

dyld调到obc库,objc库调用各个静态函数。
说明:静态函数是main函数前被触发的那些静态函数。


2.3 找出所有启动时被执行的静态函数

section里位置:Section(_DATA,__mod_init_func)
Hopper Disassembler/IDA打开debug版二进制文件,跳到__mod_init_func段.




版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

ImageLoaderMachO::doModInitFunctions crash问题

前段时间我们的APP要引用另一个公司的几个静态库,原本蛮方便的,但是出现了奇怪的问题。比如我要引用的模块是这样的,3个静态库, xxx1.a, xxx2.a, xxx3.a,1个动态库 xxx4.dy...

简介ImageLoader(一)

使用该开源项目的之前,先

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

xbmc 从android_main启动时的部分步骤记录

xbmc/android/Android_main.cpp */ extern void android_main(struct android_app* state) { { app_d...

android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明

android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a...

如何在NCL(The NCAR Command Language )启动时自动加载自定义的函数和程序

首先任意建立一个目录存放自定义的程序,例如: $ mkdir ~/MyNCL 然后建立一个环境变量: export NCL_DEF_SCRIPTS_DIR="~/MyNCL" 然后在MyNCL...

android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明

android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a...
  • zyu67
  • zyu67
  • 2015-03-07 11:53
  • 746

android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明

android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a...

iOS 对应用程序启动时所有方法的调用顺序分析(转自董铂然博客园)

一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问...

iOS开发Xcode崩溃在main函数入口时如何定位Bug的一个小方法以及一个恶心的bug介绍

iOS开发中的崩溃有两种,一种是正常崩溃在代码段,能指出来崩溃在哪一句代码,而且会给出crash reason, 这个一般来讲随便找找就能解决问题了第二种 就是致命到没朋友的崩溃在Main入口函数 ...

[C#]控制台程序静态main函数浅谈

众所周知,c#中控制台应用程序中Main函数为静态函数,那为什么不能是非静态函数呢? 分析如下: C#控制台中,如果Main是非静态函数,那么在调用的时候就需要进行实例化才能被调用,而系统在调...
  • hsppl
  • hsppl
  • 2011-09-05 20:26
  • 2566
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)