美文网首页iOS开发之深入理解runtimeRuntime源码iOS
iOS开发之runtime(13):runtime编译过程

iOS开发之runtime(13):runtime编译过程

作者: kyson老师 | 来源:发表于2019-01-11 00:34 被阅读31次

    本系列博客是本人的源码阅读笔记,如果有iOS开发者在看runtime的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

    runtime logo

    本文完整版详见笔者小专栏:https://xiaozhuanlan.com/runtime

    背景

    上一篇文章我们讲到runtime库中区__objc_init_func替代了区__mod_init_func。因此我们在runtime编译好的库文件中看不到区__mod_init_func

    那么这个替换的过程是怎么进行的呢,本文将为读者分析。

    分析

    大家知道,库的编译参数都是在target中进行设置的,如图:


    编译的文件名

    如图,如果我们设置
    EXECUTABLE_PREFIXlibbb那么库文件的前缀就是libbb,
    PRODUCT_NAMEobjc.AB那么紧跟着的就是objc.AB了,不难得出,最终的文件名为:

    libbbobjc.AB.dylib

    接着我们看其他编译参数,主要是如图所示位置:


    编译语法

    复制下来如下:

    set -x
    /usr/bin/xcrun -sdk macosx clang++ -Wall -mmacosx-version-min=10.9 -arch x86_64 -std=c++11 "${SRCROOT}/markgc.cpp" -o "${BUILT_PRODUCTS_DIR}/markgc"
    "${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"
    

    根据我们对clang的了解,这句命令应该不难理解。

    set x
    

    略过,应该是设置环境变量之类的操作。

    /usr/bin/xcrun -sdk macosx clang++ -Wall -mmacosx-version-min=10.9 -arch x86_64 -std=c++11 "${SRCROOT}/markgc.cpp" -o "${BUILT_PRODUCTS_DIR}/markgc"
    "${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"
    

    可以看出是调用的xcrun命令,关于xcrun,其实大家可以理解为xcodebuild命令的老版本,笔者之前曾经写过一篇相关的文章:
    iOS使用fastlane一键打包审核大家可以参考一下。
    这里几个参数大概介绍一下:
    -sdk macosx
    意思就是运行平台在mac上
    -mmacosx-version-min=10.9
    是指定mac的最低版本
    -arch x86_64
    指定平台是x86_64

    "${SRCROOT}/markgc.cpp"
    

    指明编译的文件

    -o "${BUILT_PRODUCTS_DIR}/markgc"
    "${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"
    

    指明输出目录以及文件名。

    因此不难看出,这里脚本的含义就是对编译后的runtime再进行读取,并编译markgc的过程。而在编译markgc的时候再进行了对区__objc_init_func替代区__mod_init_func的操作。

    总结

    本文讲解了runtime编译过程中的参数设置,以及__objc_init_func替代区__mod_init_func的原理,希望对大家有所帮助。

    相关文章

      网友评论

        本文标题:iOS开发之runtime(13):runtime编译过程

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