IOS底層(一): objc4-781 源碼編譯以及調(diào)試

OC底層源碼/原理合集

IOS了解底層代碼非常重要, 無論是我們 了解OC原理或者應(yīng)付大廠面試等, 那么第一步肯定是能運行起來蘋果源碼

這邊主要介紹下蘋果開源源碼的編譯以及調(diào)試

源碼下載地址:

蘋果objc4-781源碼 https://opensource.apple.com/tarballs/objc4/

由于目前這邊最新的就是 objc4-781, 所以就拿它開刀吧 :)

objc4-781源碼

下載之后解壓得到

objc4-781項目

運行objc.xcodeproj, 因為我們目的是源碼上面我們選擇objc, 得到我們第一個錯誤

問題1: unable to find sdk 'macosx.internal'

問題1
  • 解決方法 target → objc → Build Setting → Base SDK → macOS
    因為默認的是 macosx.internal 但是這個SDK是找不到的, 所以換成macOS的
  • 注意: objc , obc-trampolines 這兩個必須改, 但其實剩余objc-simulator, objc4_tests 也是macosx.internal找不到的, 所以我建議一起都改下
問題1解決方法

解決完繼續(xù)運行, 得到我們第二個錯誤, 文件找不到問題

問題2: 'sys/reason.h' file not found

問題2
  • 解決方法

既然提示找不到, 那我們就造一個, 項目里面創(chuàng)建文件夾, SACommon(名字隨便起)
統(tǒng)一存放找不到文件, 后面還有幾個提示文件找不到的問題

  1. SACommon下建立sys文件夾, 然后去找reason.h文件
問題2-建立文件夾

Apple source: https://opensource.apple.com

找到 10.15, 當(dāng)然依舊下最新的10.15.6, 別問為什么, 老渣男了, 喜歡喜新厭舊


問題2-找macOs10.15

找到xnu這里面有我們想要的reason.h, 可以 command + f 模糊搜索xnu , 找到后點擊下載

問題2-找xnu

(先別著急關(guān)頁面, 我們之后還會用到下載其他資源)

  1. xnu 中找到bsd → sys → reason.h 放入我們剛才建立的SACommon → sys 文件夾內(nèi)
問題2-找到reason.png

問題2-放入reason.png
  1. 配置文件檢索路徑: target → objc → Build Setting → Header Serach Paths中添加搜索路徑 $(SRCROOT)/SACommon
問題2-配置路徑

這個問題解決, 我們再運行, 得到我們第三個錯誤

問題3: mach-o/dyld_priv.h' file not found

問題3
  1. 照舊 SACommon下新建mach-o文件夾, 然后去找dyld_priv.h文件

Apple source10.15.6: https://opensource.apple.com/release/macos-10156.html

2.找到dyld里面有我們想要的dyld_priv.h, command + f 模糊搜索dyld , 找到后點擊下載

問題3-找到dyld
  1. dyld 中找到include → mach-o → dyld_priv.h 放入我們剛才建立的文件夾內(nèi) SACommon → mach-o → dyld_priv.h
問題3-找到dyld_priv.h
問題3-放入dyld_priv.h
  1. 放入之后, 還需要修改 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

這個問題解決, 我們再運行, 得到我們第四個錯誤

問題4: 'os/lock_private.h' file not found , dyld_priv.h中 bridgeos(3.0) 報錯

問題4.png
問題4-bridgeos(3.0).png
  1. 先解決這個bridgeos 3.0這個, Bridge OS是Apple獨立的T2安全芯片使用的嵌入式操作系統(tǒng), 而在這里我們用不到這個系統(tǒng)所以刪掉即可


    問題4-bridgeos(3.0)修改
  2. 照舊 SACommon下新建os文件夾, 然后去找lock_private.h文件

Apple source10.15.6: https://opensource.apple.com/release/macos-10156.html

3.找到libplatform里面有我們想要的lock_private.h, command + f 模糊搜索libplatform , 找到后點擊下載

問題4-libplatform

  1. libplatform 中找到private → os → lock_private.h 放入我們剛才建立的文件夾內(nèi) SACommon → os → lock_private.h
問題4-lock_private.png
問題4-放入lock_private

這個問題解決, 我們再運行, 得到我們第五個錯誤

問題5: 'os/base_private.h' file not found

其實5跟4可以放一起解決, 因為都在 libplatform里面

libplatform 中找到private → os → base_private.h 放入我們剛才建立的文件夾內(nèi) SACommon → os → base_private.h

問題5-base_private
問題5-放入base_private.png

同樣之后運行l(wèi)ock_private也會報bridgeos這個錯誤, 去掉即可


bridgeos(4.0).png

這個問題解決, 我們再運行, 得到我們第六個錯誤

問題6: 'pthread/tsd_private.h' file not found

問題6.png
  1. 照舊 SACommon下新建pthread文件夾, 然后去找tsd_private.h文件

Apple source10.15.6: https://opensource.apple.com/release/macos-10156.html

2.找到libpthread里面有我們想要的tsd_private.h, command + f 模糊搜索libpthread , 找到后點擊下載

問題6-libpthread
  1. libpthread 中找到private → tsd_private.h 放入我們剛才建立的文件夾內(nèi) SACommon → pthread → tsd_private.h
問題6-tsd_private.png

這個問題解決, 我們再運行, 得到我們第七個錯誤

問題7: 'System/machine/cpu_capabilities.h' file not found

問題7
  1. 照舊 SACommon下新建System文件夾,進入System在創(chuàng)建machine文件夾, 然后去找cpu_capabilities.h文件

Apple source10.15.6: https://opensource.apple.com/release/macos-10156.html

2.找到xnu們想要的cpu_capabilities.h, command + f 模糊搜索xnu , 找到后點擊下載

xnu
  1. xnu 中找到osfmk → machine → cpu_capabilities.h 放入我們剛才建立的文件夾內(nèi) SACommon → System → machine → cpu_capabilities.h
放入cpu_capabilities.h

這個問題解決, 我們再運行, 得到我們第八個錯誤

問題8: 'os/tsd.h' file not found

問題8.png
  1. tsd.h也是在問題7 xnu 中,

  2. xnu 中找到libsysycall → os → tsd.h 放入之前建立的文件夾內(nèi) SACommon → os → tsd.h

放入tsd

這個問題解決, 我們再運行, 得到我們第九個錯誤

問題9: 'pthread/spinlock_private.h' file not found

問題9.png
  1. 照舊 去找spinlock_private.h文件, 這個跟問題6一樣都在libpthread里面

  2. libpthread 中找到private → spinlock_private.h 放入之前建立的文件夾內(nèi) SACommon → pthread → spinlock_private.h (圖片箭頭標錯了, 應(yīng)該指向spinlock_private.h :) )

放入spinlock_private

這個問題解決, 我們再運行, 得到我們第十個錯誤

問題10: 'System/pthread_machdep.h' file not found

  1. 照舊 去找pthread_machdep.h文件, 這個在 Libc中

Apple source Libc: https://opensource.apple.com/tarballs/Libc/

2.這里留意下Libc不能下最新的, 里面沒有這個spinlock_private.h文件, 這個里面要下583的這個command + f 模糊搜索Libc-583 找到后點擊下載

Libc
  1. Libc-583 中找到pthreads → os → pthread_machdep.h 放入之前建立的System內(nèi) SACommon → System → pthread_machdep.h
放入pthread_machdep.h

這個問題解決, 我們再運行, 得到我們第十一個錯誤

問題11: 'CrashReporterClient.h' file not found

問題11
  1. 照舊 去找'CrashReporterClient.h文件, 這個在也在Libc中, 這里也是留意下Libc不能下最新的, 也是沒有這個 CrashReporterClient.h文件, 在 Libc-825.24中

Apple source Libc: https://opensource.apple.com/tarballs/Libc/

lib825.24.png
  1. Libc-825.24 中找到include → CrashReporterClient.h 放入SACommon內(nèi) SACommon → CrashReporterClient.h
放入CrashReporterClient.h

3.引入之后CrashReporterClient.h 還是報找不到問題


CrashReporterClient.h not found

方法① 需要在 Build Settings -> Preprocessor Macros 中加入LIBC_NO_LIBCRASHREPORTERCLIENT

Preprocessor Macros

如果還是報錯(網(wǎng)上看到的)
方法② 直接更改了里面的宏信息 #define LIBC_NO_LIBCRASHREPORTERCLIENT
方法③ 如果還是報錯CrashReporterClient 的問題,解決方法是 在BuildSetting --> Other Linker Flags 中去掉CrashReporterClient .

因為我這邊只是方法① 就已經(jīng)修復(fù)好, 方法②, 方法③我這邊沒試 :)

這個問題解決, 我們再運行, 得到我們第十二個錯誤

問題12: pthread_machdep.h 中 Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int')), Static declaration of '_pthread_has_direct_tsd' follows non-static declaration, Static declaration of '_pthread_getspecific_direct' follows non-static declaration

pthread_machdep

把報錯的地方注釋掉, 這里注意下一定要注釋全, 別漏代碼


注釋

這個問題解決, 我們再運行, 得到我們第十三個錯誤

問題13: 'objc-shared-cache.h' file not found

問題13
  1. 在之前問題3下載的dyld里面找到include → objc-shared-cache.h 放入SACommon內(nèi) SACommon → objc-shared-cache.h
objc-shared-cache.png

這個問題解決, 我們再運行, 得到我們第十四個錯誤

問題14: objc-errors.mm中報錯 '_simple.h' file not found

  1. 在之前問題4下載的libplatform里面找到private → _simple.h 放入SACommon內(nèi) SACommon → _simple.h
放入_simple.h

這個問題解決, 我們再運行, 得到我們第十五個錯誤

問題15: kern/restartable.h

問題15
  1. SACommon 中新建kern文件夾, 在之前問題2下載的xnu里面找到osfmk → kern 放入SACommon內(nèi) SACommon → kern → restartable.h
5960B4FC-535A-4817-AB89-72FB12B72E12.png

這個問題解決, 我們再運行, 得到我們第十六個錯誤

問題16: 'Block_private.h' file not found

問題16

Apple source : https://opensource.apple.com/release/macos-1015.html

1.command + f 模糊搜索libclosure 找到后點擊下載, 里面有我們想要的Block_private.h

libclosure
  1. 在剛才下載的 libclosure 找到Block_private.h 放入SACommon內(nèi) SACommon → Block_private.h
Block_private

這個問題解決, 我們再運行, 得到我們第十七個錯誤

問題17: Mismatch in debug-ness macros

問題17

這個簡單, 注釋掉objc-runtime.mm中的#error mismatch in debug-ness macros即可

這個問題解決, 我們再運行, 得到我們第十八個錯誤

問題18: libobjc.order 路徑問題

問題18.png

targets → Build Settings → Order File 添加 $(SRCROOT)/libobjc.order

libobjc.order

這個問題解決, 我們再運行, 得到我們第十九個錯誤

問題19: /xcodebuild:1:1: SDK "macosx.internal" cannot be located. 編譯腳本問題

問題19

targets → Build Phases → Run Scriptmacosx.internal 改成 macosx

macosx

這個問題解決, 我們再運行, OK, 沒有再報錯, 那么接下來我們就可以加些東西來進行編譯調(diào)試

編譯調(diào)試環(huán)節(jié)

targets 點擊 "+" 新建 target: SATest

編譯1
編譯2
編譯3

綁定依賴關(guān)系 Dependencies → objc, Link Binary With Libraries → libobjc.A.dylib

編譯4
編譯5
編譯6

源碼調(diào)試環(huán)節(jié)

在之前建立的SATest中 創(chuàng)建 SAPerson對象(名字隨便取)

源碼調(diào)試1

targets → SATest → Build Phases → Compile Sourcesmain.m 放在最上面方便斷點調(diào)試

源碼調(diào)試2

接下來main.m 中引入 SAPerson.h頭文件, 運行項目選擇SATest 就可以愉快的進行源碼調(diào)試


源碼調(diào)試3

需要總共下載項目


總結(jié).png

編譯好的objc4-781源碼下載
編譯好的objc4-818源碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隘谣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抒蚜,更是在濱河造成了極大的恐慌,老刑警劉巖耘戚,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡髓,死亡現(xiàn)場離奇詭異,居然都是意外死亡毕莱,警方通過查閱死者的電腦和手機器贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朋截,“玉大人,你說我怎么就攤上這事吧黄〔糠” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵拗慨,是天一觀的道長廓八。 經(jīng)常有香客問我,道長赵抢,這世上最難降的妖魔是什么剧蹂? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮烦却,結(jié)果婚禮上宠叼,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好冒冬,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布伸蚯。 她就那樣靜靜地躺著,像睡著了一般简烤。 火紅的嫁衣襯著肌膚如雪剂邮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天横侦,我揣著相機與錄音挥萌,去河邊找鬼枉侧。 笑死瑞眼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辆影,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徒像,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛙讥?” 一聲冷哼從身側(cè)響起锯蛀,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次慢,沒想到半個月后旁涤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡迫像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年劈愚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闻妓。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡菌羽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出由缆,到底是詐尸還是另有隱情注祖,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布均唉,位于F島的核電站是晨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舔箭。R本人自食惡果不足惜罩缴,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靴庆,春花似錦时捌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焰薄,卻和暖如春拿诸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塞茅。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工亩码, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人野瘦。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓描沟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞭光。 傳聞我的和親對象是個殘疾皇子吏廉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355