美文网首页
dyld与objc的关联

dyld与objc的关联

作者: 猿人 | 来源:发表于2020-10-19 14:07 被阅读0次

    在上篇文章 dyld 了流程分析 中我们大概了解了 程序启动 到main函数之前dyld做了哪些事情
    dyld 流程之第8步 【执行初始化方法】 我们也做了具体分析,通过堆栈加源码查看 了解到recursiveInitialization是一个递归函数,初始化各种链接库,库的优先级最高的为libSystem 初始化, libSystem_initializer(libSystem.B.dylib) --> _os_object_init(libdispatch.dylib) --> _objc_init(libobjc.A.dylib) 而 _objc_init函数的调用 里面发现了 _dyld_objc_notify_register , dyld又发现了其接口,固实际上在进行跨库操作 从libobjc库 跨越到 dyld,正好形成了一个闭环,分析dyld接口_dyld_objc_notify_register 得知 notifySingle里面的函数 sNotifyObjCInit 正是 libobjc库中的loadimages 这里也就得出了结论 , dyld 函数recursiveInitialization 调用 初始化 libobjc库并向 自己 注册回调函数 得到libobjc库的函数实现。 在合适的时机 再次调用libobjc的回调函数实现。 下面我们开始分析_objc_init 到底 做了什么事情,以及向dyld注册回调函数剩下的函数是什么也就是 _dyld_objc_notify_registerloadimages 其他的参数

    _objc_init (libobjc)

    截屏2020-10-19 上午11.16.15.png
    • map_images:dyld 将image镜像文件加载进内存时,会触发该函数
    • load_images:dyld 初始化image会触发该函数
    • unmap_image: dyld将image移除时会触发该函数

    _dyld_objc_notify_register(dyld)

    从 _dyld_objc_notify_register --> void registerObjCNotifiers(

    截屏2020-10-19 上午11.30.21.png

    总结

    _dyld_objc_notify_register.jpg

    map_images 函数实现

    map_images 会调用 map_images_nolock方法 下面为精简代码


    map_images.jpg

    map_images 函数调用 (dyld sNotifyObjCMapped 调用时机)

    dyld全局搜索 sNotifyObjcMapped ( registerObjCNotifiers --> notifyBatchPartial --> sNotifyObjCMapped)


    2251862-cad06a9820c87f75-2.jpg

    由此可以看出 map_images是先于load_images调用,即先map_images ,再load_images
    下一篇 类的加载(上)

    相关文章

      网友评论

          本文标题:dyld与objc的关联

          本文链接:https://www.haomeiwen.com/subject/kbhkmktx.html