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

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

準(zhǔn)備工作

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

需要下載以下依賴(lài)文件


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

源碼編譯

編譯源碼就是不斷調(diào)試的過(guò)程物遇,主要有以下問(wèn)題:

問(wèn)題一:unable to find sdk 'macosx.internal'
2.png
  • 全局搜索macosx.internal俩功,找到下圖所示位置
    3.png
  • macosx.internal改為macOS 10.15,兩處均需修改
    4.png
問(wèn)題二:文件找不到的報(bào)錯(cuò)問(wèn)題
1扔傅、'sys/reason.h' file not found
5.png
  • objc4-781的根目錄下新建LCCommon文件, 同時(shí)在LCCommon文件中創(chuàng)建sys文件
  • 在之前準(zhǔn)備的依賴(lài)文件中全局搜索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)備的依賴(lài)文件中全局搜索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)報(bào)錯(cuò)
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)備的依賴(lài)文件中全局搜索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)備的依賴(lài)文件中全局搜索tsd_private.hspinlock_private.h文件慢叨,并將文件拷貝至 pthread文件中
6纽匙、'System/machine/cpu_capabilities.h' file not found
4.png
  • LCCommon中創(chuàng)建 System文件,接著創(chuàng)建machine文件

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

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

在最新版的macOS 10.15中最新版下載的libc中沒(méi)有這個(gè)h文件,需要下載Libc-583版本

9气嫁、'CrashReporterClient.h' file not found
  • 這個(gè)文件在 Libc-825.24 中找到該文件,路徑為Libc-825.24/include/CrashReporterClient.h
  • 導(dǎo)入下載的還是報(bào)錯(cuò)够坐,可以通過(guò)以下方式解決
    • 需要在 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文件報(bào)備制拷貝到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 路徑問(wèn)題

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 腳本編譯問(wèn)題

問(wèn)題: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)試

  • 新建一個(gè)target :LCTest


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

    2.png

源碼調(diào)試

  • 自定義一個(gè)LCPerson類(lèi)

    3.png

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

    4.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陪白,隨后出現(xiàn)的幾起案子颈走,更是在濱河造成了極大的恐慌,老刑警劉巖咱士,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立由,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡序厉,警方通過(guò)查閱死者的電腦和手機(jī)锐膜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弛房,“玉大人道盏,你說(shuō)我怎么就攤上這事⊥ピ伲” “怎么了捞奕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)拄轻。 經(jīng)常有香客問(wèn)我颅围,道長(zhǎng),這世上最難降的妖魔是什么恨搓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任院促,我火速辦了婚禮,結(jié)果婚禮上斧抱,老公的妹妹穿的比我還像新娘常拓。我一直安慰自己,他們只是感情好辉浦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布弄抬。 她就那樣靜靜地躺著,像睡著了一般宪郊。 火紅的嫁衣襯著肌膚如雪掂恕。 梳的紋絲不亂的頭發(fā)上拖陆,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音懊亡,去河邊找鬼依啰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛店枣,可吹牛的內(nèi)容都是我干的速警。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸯两,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闷旧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起甩卓,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸠匀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逾柿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宵距,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘症,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年懂鸵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掸茅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弱匪,死狀恐怖青瀑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萧诫,我是刑警寧澤斥难,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站帘饶,受9級(jí)特大地震影響哑诊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜及刻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一镀裤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缴饭,春花似錦暑劝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春毁习,著一層夾襖步出監(jiān)牢的瞬間智嚷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工纺且, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稍浆。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓载碌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親衅枫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫁艇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345