iOS底層探究-02:objc4-781源碼編譯&調(diào)試

學(xué)會編譯objc4-781的源碼,然后在源碼中進(jìn)行調(diào)試,便于探究底層的實現(xiàn)流程

準(zhǔn)備工作

環(huán)境版本 & 最新objc源碼
  • mac OS 10.15
  • Xcode 11.6
  • objc4-781
    下載 objc4-781 源碼
依賴文件下載

需要下載以下依賴文件


1.png
  • 其中除了其中 launchd-842.92.1 需要在Mac OS X 10.9.5下載,其他的均可以在最新的的版本macOS 10.15中檢索到

源碼編譯

編譯源碼就是不斷調(diào)試的過程,主要有以下問題:

問題一:unable to find sdk 'macosx.internal'
2.png
  • 全局搜索macosx.internal,找到下圖所示位置
    3.png
  • macosx.internal改為macOS 10.15,兩處均需修改
    4.png
問題二:文件找不到的報錯問題
1、'sys/reason.h' file not found
5.png
  • objc4-781的根目錄下新建LCCommon文件, 同時在LCCommon文件中創(chuàng)建sys文件
  • 在之前準(zhǔn)備的依賴文件中全局搜索reason.h文件
    1.png
  • 然后將其拷貝到sys文件中
    2.png
  • 設(shè)置文件檢索路徑:選擇 target -> objc -> Build Settings,在工程的 Header Serach Paths 中添加搜索路徑 $(SRCROOT)/LCCommon
3.png
2、'mach-o/dyld_priv.h' file not found
6.png
  • LCCommon文件中 創(chuàng)建mach-o文件

  • 在之前準(zhǔn)備的依賴文件中全局搜索dyld_priv.h文件

    4.png

  • 將其拷貝到 mach-o文件中

    5.png

  • 拷貝到文件后,還需要修改dyld_priv.h文件,即在 dyld_priv.h文件頂部加入一下宏:

#define DYLD_MACOSX_VERSION_10_11 0x000A0B00
#define DYLD_MACOSX_VERSION_10_12 0x000A0C00
#define DYLD_MACOSX_VERSION_10_13 0x000A0D00
#define DYLD_MACOSX_VERSION_10_14 0x000A0E00
3、bridgeos(3.0)、bridgeos(4.0)報錯
1.png
  • dyld_priv.h文件中搜索 bridgeos(3.0)將其刪除(可以用空格全部替代)
  • lock_private.h文件中搜索 bridgeos(4.0)將其刪除
4、'os/lock_private.h' file not found 和 'os/base_private.h' file not found
2.png
  • LCCommon中創(chuàng)建 os文件
  • 在之前準(zhǔn)備的依賴文件中全局搜索lock_private.hbase_private.h文件,并將文件拷貝至 os文件中
    3.png
5、'pthread/tsd_private.h' file 和 'pthread/spinlock_private.h' file not found
  • LCCommon中創(chuàng)建 pthread文件
  • 在之前準(zhǔn)備的依賴文件中全局搜索tsd_private.h、spinlock_private.h文件,并將文件拷貝至 pthread文件中
6、'System/machine/cpu_capabilities.h' file not found
4.png
  • LCCommon中創(chuàng)建 System文件,接著創(chuàng)建machine文件

在之前準(zhǔn)備的依賴文件中全局搜索cpu_capabilities.h文件(選擇此路徑下的xnu-6153.141.1/osfmk/machine),并將文件拷貝至 machine文件中

7、'os/tsd.h' file not found
  • 在之前準(zhǔn)備的依賴文件中全局搜索tsd.h文件(選擇此路徑下的xnu-6153.141.1/libsyscall/os),并將文件拷貝至 os文件中
    8.png
8、'System/pthread_machdep.h' file not found
  • 這個地址下載pthread_machdep.h文件,h文件路徑為:Libc-583/pthreads/pthread_machdep.h
  • 將其拷貝至System文件中

在最新版的macOS 10.15中最新版下載的libc中沒有這個h文件,需要下載Libc-583版本

9、'CrashReporterClient.h' file not found
  • 這個文件在 Libc-825.24 中找到該文件,路徑為Libc-825.24/include/CrashReporterClient.h
  • 導(dǎo)入下載的還是報錯,可以通過以下方式解決
    • 需要在 Build Settings -> Preprocessor Macros 中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
10、'objc-shared-cache.h' file not found
  • 文件路徑為:dyld-732.8 --> include --> objc-shared-cache.h

    1.png

  • 將.h文件報備制拷貝到LCCommon

11、'_simple.h' file not found
  • 文件路徑為:libplatform-220 --> private --> _simple.h
    2.png
  • 將.h文件拷貝到LCCommon
12、'kern/restartable.h' file not found
  • 在LCCommon中創(chuàng)建kern文件
  • 找到.h文件,路徑為xnu-6153.141.1 --> osfmk --> kern -->restartable.h,拷貝到kern
    3.png
13、'Block_private.h' file not found
  • 找到 .h 文件,文件路徑為libclosure-74 --> Block_private.h

    4.png

  • 將.h文件拷貝到LCCommon

14、libobjc.order 路徑問題

ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order

  • 選擇 target -> objc -> Build Settings
  • 在工程的 Order File 中添加搜索路徑$(SRCROOT)/libobjc.order
    5.png
15、library not found -lCrashReporterClient
2.png
  • TARGETS - objc - Build Settings 搜索 other link 找到lCrashReporterClient將其刪除
    3.png
16、Xcode 腳本編譯問題

問題:Showing All Messages /xcodebuild:1:1: SDK "macosx.internal" cannot be located.

  • 選擇 target -> objc -> Build Phases -> Run Script(markgc)
  • 把腳本文本 macosx.internal 改成 macosx
    4.png

編譯調(diào)試

  • 新建一個target :LCTest


    1.png
  • 關(guān)聯(lián)二進(jìn)制依賴關(guān)系

    2.png

源碼調(diào)試

  • 自定義一個LCPerson

    3.png

  • 在main.m中 創(chuàng)建 LCPerson的對象,開啟你的源碼探索之旅吧

    4.png

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

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