本系列博客是本人的源码阅读笔记,如果有iOS开发者在看runtime的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论
本文完整版详见笔者小专栏:https://xiaozhuanlan.com/runtime
背景
上一篇文章我们讲到runtime库中区__objc_init_func
替代了区__mod_init_func
。因此我们在runtime编译好的库文件中看不到区__mod_init_func
:
那么这个替换的过程是怎么进行的呢,本文将为读者分析。
分析
大家知道,库的编译参数都是在target中进行设置的,如图:
编译的文件名
如图,如果我们设置
EXECUTABLE_PREFIX
为libbb
那么库文件的前缀就是libbb,
PRODUCT_NAME
为 objc.AB
那么紧跟着的就是objc.AB
了,不难得出,最终的文件名为:
接着我们看其他编译参数,主要是如图所示位置:
编译语法
复制下来如下:
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
的原理,希望对大家有所帮助。
网友评论