本系列博客是本人的源碼閱讀筆記碟联,如果有 iOS 開發(fā)者在看 runtime 的脑豹,歡迎大家多多交流抗愁。為了方便討論馁蒂,本人新建了一個(gè)微信群(iOS技術(shù)討論群),想要加入的蜘腌,請?zhí)砑颖救宋⑿牛簔hujinhui207407沫屡,【加我前請備注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中撮珠,歡迎一起討論
本文完整版詳見筆者小專欄:https://xiaozhuanlan.com/runtime
背景
上一篇文章我們講到runtime庫中區(qū)__objc_init_func
替代了區(qū)__mod_init_func
沮脖。因此我們在runtime編譯好的庫文件中看不到區(qū)__mod_init_func
:
那么這個(gè)替換的過程是怎么進(jìn)行的呢,本文將為讀者分析芯急。
分析
大家知道勺届,庫的編譯參數(shù)都是在target中進(jìn)行設(shè)置的,如圖:
如圖娶耍,如果我們設(shè)置
EXECUTABLE_PREFIX
為libbb
那么庫文件的前綴就是libbb免姿,
PRODUCT_NAME
為 objc.AB
那么緊跟著的就是objc.AB
了,不難得出伺绽,最終的文件名為:
接著我們看其他編譯參數(shù)养泡,主要是如圖所示位置:
復(fù)制下來如下:
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"
根據(jù)我們對clang的了解嗜湃,這句命令應(yīng)該不難理解奈应。
set x
略過澜掩,應(yīng)該是設(shè)置環(huán)境變量之類的操作。
/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"
可以看出是調(diào)用的xcrun命令杖挣,關(guān)于xcrun肩榕,其實(shí)大家可以理解為xcodebuild命令的老版本,筆者之前曾經(jīng)寫過一篇相關(guān)的文章:
iOS使用fastlane一鍵打包審核大家可以參考一下惩妇。
這里幾個(gè)參數(shù)大概介紹一下:
-sdk macosx
意思就是運(yùn)行平臺在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再進(jìn)行讀取歌殃,并編譯markgc的過程乔妈。而在編譯markgc的時(shí)候再進(jìn)行了對區(qū)__objc_init_func
替代區(qū)__mod_init_func
的操作。
總結(jié)
本文講解了runtime編譯過程中的參數(shù)設(shè)置氓皱,以及__objc_init_func
替代區(qū)__mod_init_func
的原理路召,希望對大家有所幫助。
廣告
我的首款個(gè)人開發(fā)的APP壁紙寶貝上線了波材,歡迎大家下載股淡。