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段.




趣谈iOS运行时之方法调用原理

导语 消息转发 OC的动态语言特性 1动态类型 2动态绑定 3动态加载 导语一个成熟的计算机语言必然有丰富的体系,复杂的容错机制,处理逻辑以及判断逻辑。但这些复杂的逻辑都是围绕一个主线丰富和展开的,所...
  • u012946824
  • u012946824
  • 2016年06月30日 10:55
  • 2963

java静态和非静态代码块的执行顺序

1、静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造方法。  2、在静态方法里面只能直...
  • fengzijia
  • fengzijia
  • 2015年11月19日 22:39
  • 1845

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

xbmc/android/Android_main.cpp */ extern void android_main(struct android_app* state) { { app_d...
  • fofu33
  • fofu33
  • 2015年06月01日 09:05
  • 566

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

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

C语言中没有main函数生成可执行程序的几种方法

1、define预处理指令 这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串。示例程序如下: #include #define begin main int ...
  • bai_wen_ping
  • bai_wen_ping
  • 2013年10月20日 22:40
  • 335

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

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

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

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

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

首先任意建立一个目录存放自定义的程序,例如: $ mkdir ~/MyNCL 然后建立一个环境变量: export NCL_DEF_SCRIPTS_DIR="~/MyNCL" 然后在MyNCL...
  • rumswell
  • rumswell
  • 2013年11月04日 16:47
  • 2641

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

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

iOS-对应用程序启动时所有方法的调用顺序分析

一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问...
  • like_sky_
  • like_sky_
  • 2016年06月22日 16:31
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS程序启动时main函数前执行的部分-load方法和静态函数
举报原因:
原因补充:

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