在項目開發(fā)中,我們很少能進(jìn)到底層看iOS源碼,這樣感覺不是很爽,那么我們有什么辦法可以看到源碼呢?
其實在https://opensource.apple.com/tarballs/objc4/
可以看到objc的源碼,這里我們就開始最新的objc4-781的源碼編譯與調(diào)試。
準(zhǔn)備工作
- Mac版本系統(tǒng)macOS Catalina 10.15.7
- Xcode 12.2
- objc4-781源碼(https://opensource.apple.com/tarballs/objc4/)
首先直接編譯objc源碼
此時會出現(xiàn)問題1Showing All Messages unable to find sdk 'macosx.internal',選擇Build Setting ->Base SDK 為macOS。

再編譯調(diào)試,報錯問題2sys/reason.h' file not found

這是缺少objc4的依賴庫。
- 下載地址為https://opensource.apple.com/release/macos-10156.html。
- 定位reason.h
reason.h site:opensource.apple.com
下載xnu文件
解壓后
新建一個group->sys,添加復(fù)制上圖中的reason.h文件。
配置文件路徑:target->objc->System Header Search Paths添加$(SRCROOT)/LostHeader
配置reason文件路徑.png
接下來再運行,發(fā)現(xiàn)報錯問題3mach-o/dyld_priv.h' file not found
再使用dyld_priv.h site:opensource.apple.com定位這個文件是在那個文件夾的中

表示在dylb文件中,此時先進(jìn)入https://opensource.apple.com

點擊進(jìn)去來到https://opensource.apple.com/release/macos-10156.html
搜索dylb

下載解壓
dyld-750.6文件搜索
dyld_priv.h文件找到此文件,復(fù)制拷貝到LostHeader->mach-o文件中
運行會報錯問題4

bridgeos(3.0)好像與搭載了T2 芯片有關(guān),但是目前只有 Pro 和 2018 款 Pro 搭載了 T2 芯片,可以把這相關(guān)的代碼屏蔽掉。
再運行報錯問題5
os/lock_private.h' file not found此刻就按照上面出現(xiàn)
mach-o/dyld_priv.h' file not found這樣的錯誤,定位文件lock_private.h,下載對應(yīng)的文件libplatform-220.100.1,找到lock_private.h復(fù)制到LostHeader->os文件中
類似的問題:
- 1
sys/reason.h file not found下載對應(yīng)文件xnu-6153.141.1 - 2
mach-o/dyld_priv.h file not found下載對應(yīng)文件dyld-750.6 - 3
os/lock_private.h file not found下載對應(yīng)文件libplatform-220.100.1 - 4
os/base_private.h file not found下載對應(yīng)文件libplatform-220.100.1
再運行出現(xiàn)問題6還是bridgeos問題,可以直接屏蔽掉。
問題6
問題7報四個錯誤
問題7
前面三個問題跟前面問題6屏蔽相關(guān)聯(lián),目前先屏蔽后面再看看有什么報錯沒有。
再運行出現(xiàn)pthread/base_private.h file not found,這個直接在https://opensource.apple.com/release/macos-10156.html搜索libdispatch
下載libdispatch-1173.100.2找到private->tsd_private.h復(fù)制粘貼到objc源碼中。
運行報錯 'System/machine/cpu_capabilities.h' file not found。
此時可以在本地電腦搜索下cpu_capabilities.h,找到文件。

復(fù)制添加到objcLostHeader->System->machine中。再運行.
報錯'os/tsd.h' file not found
在xnu-6153.141.1->libsyscall->os中可以找到

復(fù)制添加到objcLostHeader->os中。再運行.
報錯'pthread/spinlock_private.h' file not found
在libpthread-416.100.3->private中可以找到

復(fù)制添加到objcLostHeader->pthread中。再運行.
報錯''System/pthread_machdep.h' file not found
找pthread_machdep.h,下載地址https://opensource.apple.com/tarballs/Libc/。 此時最新的Lib中沒有pthread_machdep.h文件,需要下載583這個的Lib

在Libc->pthreads找到文件,

control+c,然后control+v到objcLostHeader->System中

再運行報錯
'CrashReporterClient.h' file not found
下載地址https://opensource.apple.com/tarballs/Libc/。 此時最新的Lib中沒有CrashReporterClient.h文件,需要下載Libc-825.24

在Libc-825.24中找到include找到CrashReporterClient.h

control+c,然后control+v到objc
LostHeader中。
此時運行,報錯'objc-shared-cache.h' file not found
在dyld-750.6中include中找到objc-shared-cache.h

control+c,control+v到objc中LostHeader文件里面

接著運行,報錯三個錯誤
Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))Static declaration of '_pthread_getspecific_direct' follows non-static declarationStatic declaration of '_pthread_has_direct_tsd' follows non-static declaration

把三個部分注釋掉,一個自定義類型,兩個函數(shù)都注釋完全。別漏掉,不然會報錯喲。
再運行,報錯'_simple.h' file not found
在之前下載的libplatform文件中private可以找到

control+c,control+v到objc中LostHeader文件里面
再運行,報錯'kern/restartable.h' file not found' file not found
在之前下載的xnu-6153.141.1文件中osfmk->kern可以找到

control+c,control+v到objc中LostHeader->kern文件里面
再運行,報錯Mismatch in debug-ness macros

注釋掉#error mismatch in debug-ness macros
再運行,報錯'Block_private.h' file not found
鏈接地址https://opensource.apple.com/release/macos-10156.html。搜索libclosure

下載libclosure-74文件

control+c,control+v到objc中LostHeader文件里面
再運行報錯ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/AppleInternal/OrderFiles/libobjc.order

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

再運行報錯library not found for -lCrashReporterClient

在build Settings -> Other Linker Flags 刪除-lCrashReporterClient

運行,報錯'_static_assert' declared as an array with a negative size

注釋掉這行。
再運行,出現(xiàn)三個錯誤
/Users/mac/Desktop/MartinDemo/objc4-781/xcodebuild:1:1: SDK "macosx.internal" cannot be located./Users/mac/Desktop/MartinDemo/objc4-781/xcrun:1:1: sh -c '/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk macosx.internal -find clang++ 2> /dev/null' failed with exit code 16384: (null) (errno=No such file or directory)/Users/mac/Desktop/MartinDemo/objc4-781/xcrun:1:1: unable to find utility "clang++", not a developer tool or in PATH

第一個錯誤target->Build Phases -> Run Script 將macosx.internal 改成 macosx

解決以上問題,再運行,沒有報錯了,接下來可以添加下main.m文件編譯調(diào)試下。
編譯調(diào)試
添加MTObjc運行端

MTObjc綁定關(guān)系 MTObjc->Build Phases-> Dependencies,綁定objc


Link Binary With Libraries → libobjc.A.dylib

添加main.m文件


再運行,就成功啦。
所需要依賴下載的項目

- xnu-6153.141.1
- libpthread-416.100.3
- libplatform-220.100.1
- libdispatch-1173.100.2
- libclosure-74
- Libc-825.24
- Libc-583
- dyld-750.6





