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




相关文章推荐

简介ImageLoader(一)

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

iOS 程序 main 函数之前发生了什么

2014年8月30日 我是前言 一个 iOS App 的 main 函数位于 main.m 中,这是我们熟知的程序入口。但对 objc 了解更多之后发现,程序在进入我们的 main 函数前...
  • fishmai
  • fishmai
  • 2016年08月14日 22:16
  • 551

iOS程序main函数之前发生了什么

【出差外地校招,有位面试的同学是这位博主的粉丝,给我推荐了他的博客】http://blog.sunnyxx.com/2014/08/30/objc-pre-main/ 我是前言 一...

ImageLoaderMachO::doModInitFunctions crash问题

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

四个刷掉菜鸟iOS方法

1、Struct和Class的区别 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗?...

ObjC Runtime(二):配置调试环境

[https://xiuchundao.me/post/config-runtime-debug-environment]好文章 ObjC Runtime(二):配置调试环境 2016...

dyld源码分析-动态加载main的流程和load函数执行的流程

0x00 摘要 在OS X或者IOS上运行一个程序时,dyld除了需要加载主要的执行程序之外,还需要加载需要的库文件以及库文件依赖的库文件。 1 2 // instantiate I...
  • fishmai
  • fishmai
  • 2016年05月15日 22:28
  • 1704

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
  • 538

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

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

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

android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a...
  • zyu67
  • zyu67
  • 2015年03月07日 11:53
  • 815
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS程序启动时main函数前执行的部分-load方法和静态函数
举报原因:
原因补充:

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