OC底層原理-objc818源碼編譯

objc818編譯

一、準(zhǔn)備工作

Xcode:Version 12.3
macOS:Version 10.15.7
objc源碼:objc4-818.2.tar.gz

二、開始配置

使用Xcode打開解壓后的objc源碼。直接編譯objc,此時(shí)需要修改Xcode提示的錯(cuò)誤。

  • 【錯(cuò)誤1】
    描述:unable to find sdk 'macosx.internal'。
    解決辦法:

    • 設(shè)置 “TARGETS->objc->Build Setting->Base SDK”,將其值設(shè)置為“macOS”。
    • 設(shè)置 “TARGETS->objc-trampolines->Build Setting->Base SDK”,將其值設(shè)置為“macOS”。
  • 【錯(cuò)誤2】
    描述:“'sys/reason.h' file not found”
    解決辦法:

    • Apple Source中找到“xnu-7195.50.7.100.1 -> bsd -> sys -> reason.h”文件并下載。
    • 在項(xiàng)目中添加自定義文件夾,用于存放該文件。
    • 在“TARGETS -> objc -> Build Setting -> Heard Search Path"中添加自定義文件夾的路徑。
  • 【錯(cuò)誤3】
    描述:“dyld_priv.h:160:148: Expected ','”
    解決辦法:將“bridgeos(3.0)”去掉。如下:

//將含有bridgeos(3.0)的代碼注釋
//extern dyld_platform_t dyld_get_base_platform(dyld_platform_t platform) __API_AVAILABLE(macos(10.14), iOS(12.0), watchos(5.0), tvos(12.0), bridgeos(3.0));
//修改后的代碼
extern dyld_platform_t dyld_get_base_platform(dyld_platform_t platform) __API_AVAILABLE(macos(10.14), iOS(12.0), watchos(5.0), tvos(12.0));
  • 【錯(cuò)誤4】
    描述:“'mach-o/dyld_priv.h' file not found“
    解決辦法:

    • Apple Source中找到“dyld-832.7.1 -> include -> mach-o -> dyld_priv.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤5】
    描述:“'os/lock_private.h'/'os/base_private.h' file not found”
    解決辦法:

    • Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> os --> lock_private.h 、base_private.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤6】
    描述:“'pthread/tsd_private.h'/'pthread/spinlock_private.h' file not found”
    解決辦法:

    • Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> tsd_private.h、spinlock_private.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤7】
    描述:“'System/machine/cpu_capabilities.h' file not found”
    解決辦法:

    • Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> tsd_private.h、spinlock_private.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤8】
    描述:“'os/tsd.h' file not found”
    解決辦法:

    • Apple Source中找到“xnu-7195.50.7.100.1 --> libsyscall --> os --> tsd.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤9】
    描述:“'System/pthread_machdep.h' file not found”
    解決辦法:

    • Apple Source中找到“Libc-583/pthreads/pthread_machdep.h”文件并下載。
    • 注意:在最新版的libc中沒有這個(gè)文件,需要在“Libc-583”中下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤10】
    描述:“'CrashReporterClient.h' file not found”
    解決辦法:

    • Apple Source中找到“Libc-825.24/include/CrashReporterClient.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
    • 注意:該文件添加之后仍然報(bào)錯(cuò),主要是因?yàn)楹辍癓IBC_NO_LIBCRASHREPORTERCLIENT”示定義的原因。
      • 解決1:在"Build Settings -> Preprocessor Macros"中添加“LIBC_NO_LIBCRASHREPORTERCLIENT”宏定義。
      • 解決2:在“CrashReporterClient.h”文件起始處,加入“#define LIBC_NO_LIBCRASHREPORTERCLIENT”。
  • 【錯(cuò)誤11】
    描述:"'os/feature_private.h' file not found"
    解決辦法:
    直接將該引用的頭文件注釋。

  • 【錯(cuò)誤12】
    描述:“'objc-shared-cache.h' file not found”
    解決辦法:

    • Apple Source中找到“dyld-832.7.1 --> include --> objc-shared-cache.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤13】
    描述:“'objc-bp-assist.h' file not found”
    解決辦法:
    直接將該引用的頭文件注釋。

  • 【錯(cuò)誤14】
    描述:“Use of undeclared identifier 'dyld_platform_version_macOS_10_13'”
    解決辦法:
    直接定位到該段代碼,并注釋掉。如下所示

//        if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_10_13)) {
//            DisableInitializeForkSafety = true;
//            if (PrintInitializing) {
//                _objc_inform("INITIALIZE: disabling +initialize fork "
//                             "safety enforcement because the app is "
//                             "too old.)");
//            }
//        }
  • 【錯(cuò)誤15】
    描述:“'_simple.h' file not found”
    解決辦法:
    • Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> _simple.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤16】
    描述:“'kern/restartable.h' file not found”
    解決辦法:
    • Apple Source中找到“xnu-7195.50.7.100.1 --> osfmk --> kern -->restartable.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤17】
    描述:“'Block_private.h' file not found”
    解決辦法:
    • Apple Source中找到“l(fā)ibclosure-78 --> Block_private.h”文件并下載。
    • 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
  • 【錯(cuò)誤18】
    描述:"objc-cache.mm:1122:33: Use of undeclared identifier 'objc_thread_get_rip'"
    解決辦法:
    將代碼直接注釋,如下所示
//#if TARGET_OS_OSX
//        if (oah_is_current_process_translated()) {
//            kern_return_t ret = objc_thread_get_rip(threads[count], (uint64_t*)&pc);
//            if (ret != KERN_SUCCESS) {
//                pc = PC_SENTINEL;
//            }
//        } else {
//            pc = _get_pc_for_thread (threads[count]);
//        }
//#else
        pc = _get_pc_for_thread (threads[count]);
//#endif
  • 【錯(cuò)誤19】
    描述:"Can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/AppleInternal/OrderFiles/libobjc.order"
    解決辦法:
    • 找到“TARGETS -> objc -> Build Setting -> Linking -> Order File”,修改成“$(SRCROOT)/libobjc.order”
  • 【錯(cuò)誤20】
    描述:“Library not found for -lCrashReporterClient”
    解決辦法:
    • 找到“TARGETS -> objc -> Build Setting -> Other Link Flags”,刪除“-lCrashReporterClient”。
  • 【錯(cuò)誤21】
    描述:“Library not found for -loah”
    解決辦法:
    • 找到“TARGETS -> objc -> Build Setting -> Other Link Flags”,刪除“-loah”。
  • 【錯(cuò)誤22】
    描述:“ObjectiveC.apinotes 異?!?br> 解決辦法:
    • 選擇“TARGETS -> objc -> Build Settings -> Text-Based InstallAPI Verification Model”中選擇“Errors Only”。
    • 清除“Other Text-Based InstallAPI Flags”中的所有內(nèi)容。

至此,已經(jīng)能完全編譯成功了。

三、開始調(diào)試

  • 新建一個(gè) Target : HQObjc


    新建項(xiàng)目
  • 添加綁定關(guān)系


    添加綁定關(guān)系
  • 此時(shí)運(yùn)行代碼,就能進(jìn)入到源碼中了。


    image.png

注意:如果經(jīng)過1、2步無(wú)法斷點(diǎn)到源碼中,需要完成以下兩步:
* 找到“HQObjc -> Build Setting -> Enable Hardended Runtime”,將其設(shè)置為“NO”。
* 確保編譯的源文件中,“main.m”處于第一位。

最終編譯通過的源碼路徑為:objc4-818可編譯源碼

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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