《OC底層系列》- 配置可編譯運(yùn)行的objc4源碼

前言

我們想要了解OC的底層是如何實(shí)現(xiàn)的,比如alloc背后的的實(shí)現(xiàn)流程,我們?nèi)绾稳ヌ骄浚?br> 總結(jié)了一下有幾下幾種辦法:
1.通過(guò)斷點(diǎn)追蹤
2.通過(guò)通過(guò)打符號(hào)斷點(diǎn)alloc
3.閱讀objc源碼

更高效的方式其實(shí)是通過(guò)運(yùn)行objc源碼的demo方式,就像我們學(xué)習(xí)一個(gè)第三方開(kāi)源庫(kù)一樣,通過(guò)在第三方庫(kù)添加斷點(diǎn)或者日志方式進(jìn)行分析學(xué)習(xí)。

如何做到從官方下載的objc源碼可編譯運(yùn)行呢?

官方提供的objc源碼之所以不能編譯運(yùn)行,主要是因?yàn)橐蕾?lài)于其他庫(kù)的一些文件,需要自己去找到對(duì)應(yīng)庫(kù)的依賴(lài)文件,然后添加到objc項(xiàng)目中并配置這些依賴(lài),其次一些工程配置,比如sdk的依賴(lài)等也需要進(jìn)行處理。
我這里提供了可編譯的objc源碼,大家可以直接在上面進(jìn)行調(diào)試分析。
objc4可編譯運(yùn)行源碼

注意環(huán)境問(wèn)題
  • objc4-750對(duì)應(yīng)的是mac10.14,Xcode11.3
  • objc4-779對(duì)應(yīng)的是mac10.15,Xcode11.4
  • objc4-781對(duì)應(yīng)的是mac 10.15,Xcode12.0.1
  • 如果750源碼運(yùn)行在mac10.15,Xcode11.4上會(huì)出現(xiàn)問(wèn)題,需根據(jù)環(huán)境選擇不同版本的源碼。

如果感興趣想要自己從頭配置,可以按如下步驟進(jìn)行,以779.1版本源碼為例:

  • 去apple官網(wǎng)開(kāi)源地址下載objc-779.1源碼
  • 然后按如下圖解進(jìn)行配置
image.png
  • 報(bào)錯(cuò):unable to find sdk 'macosx.internal'
    objc、objc-trampolines2個(gè)target都需要按下圖設(shè)置


    image.png
  • image.png

剩下的配置都是對(duì)objc項(xiàng)目的

  • 'sys/reason.h' file not found,類(lèi)似的還有其他文件找不到
    這是因?yàn)閛bjc4依賴(lài)于其他庫(kù)的源碼,需要添加到項(xiàng)目中并設(shè)置搜索路徑。相關(guān)文件都可以在官網(wǎng)源碼地址找到,這里不一一貼出來(lái)了,大家可用從我的項(xiàng)目中拷貝common文件夾添加到工程中然后按下圖配置debug和release:

    image.png

  • objc-errors.h中報(bào)錯(cuò):Use of undeclared identifier 'CRGetCrashLogMessage'


    image.png
  • 按下圖配置添加宏定義LIBC_NO_LIBCRASHREPORTERCLIENT

image.png
  • objc-runtime.h中報(bào)錯(cuò):Mismatch in debug-ness macros


    image.png

注釋掉objc-runtime.mm中的#error mismatch in debug-ness macros

/***********************************************************************
* _objc_isDebugBuild. Defined in debug builds only.
* Some test code looks for the presence of this symbol.
**********************************************************************/
#if DEBUG != OBJC_IS_DEBUG_BUILD
//#error mismatch in debug-ness macros
// DEBUG is used in our code. OBJC_IS_DEBUG_BUILD is used in the
// header declaration of _objc_isDebugBuild() because that header
// is visible to other clients who might have their own DEBUG macro.
#endif
  • ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
    解決辦法:替換為${SRCROOT}/libobjc.order
image.png
  • library not found for -lCrashReporterClient
    解決辦法:刪除Other linker Flags里的內(nèi)容


    image.png

    image.png
  • 配置更改xcrun依賴(lài)的sdk

-sdk macosx.internal改為-sdk macosx,

image.png
  • 最后的配置


    image.png
image.png
  • 正確完成以上所有配置而且,即可用正常編譯objc項(xiàng)目了。

配置過(guò)程中的報(bào)錯(cuò):

  • /xcrun:1:1: unrecognized option: -Wall
    原因是我在配置xcrun的依賴(lài)的時(shí)候,手誤不小心把macosx.internal刪除了,應(yīng)該是把macosx.internal替換為macosx,編譯重新運(yùn)行就可以了。

新建項(xiàng)目調(diào)試源碼

  • 新建一個(gè)macOS的command Line Tool項(xiàng)目,設(shè)置依賴(lài)就可以


    image.png

無(wú)法斷點(diǎn)調(diào)試問(wèn)題

升級(jí)到Xcode12.0.1后發(fā)現(xiàn)源碼添加的斷點(diǎn)不生效了,有時(shí)候在Target的main.m中添加的斷點(diǎn)也斷不住??梢詤⒖家韵聦?duì)應(yīng)方案來(lái)解決:

1.創(chuàng)建的target的main添加斷點(diǎn)不生效

  • Build Phases --> Compile Source中,將main文件移至第一位
  • Build Settings --> Enable Hardened Runtime中,設(shè)置為NO


    image.png

2.objc4源碼斷點(diǎn)不生效

  • Build Phases --> Compile Source中,將NSObject.mm文件移至第一位
  • Build Settings --> Enable Hardened Runtime中,設(shè)置為NO


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容