objc4-781源碼編譯與調(diào)試

在項目開發(fā)中,我們很少能進(jìn)到底層看iOS源碼,這樣感覺不是很爽,那么我們有什么辦法可以看到源碼呢?
其實在https://opensource.apple.com/tarballs/objc4/
可以看到objc的源碼,這里我們就開始最新的objc4-781的源碼編譯與調(diào)試。

準(zhǔn)備工作


首先直接編譯objc源碼

此時會出現(xiàn)問題1Showing All Messages unable to find sdk 'macosx.internal',選擇Build Setting ->Base SDK 為macOS。

maxosx錯誤.png

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

缺少reason.h.png

這是缺少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定位這個文件是在那個文件夾的中

dyld_priv.h

表示在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
問題4.png

bridgeos(3.0)好像與搭載了T2 芯片有關(guān),但是目前只有 Pro 和 2018 款 Pro 搭載了 T2 芯片,可以把這相關(guān)的代碼屏蔽掉。
再運行報錯問題5os/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文件中
lock_private

類似的問題:

  • 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

16079261593571.jpg

再運行報錯
'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到objcLostHeader中。

此時運行,報錯'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 declaration
  • Static 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 Scriptmacosx.internal 改成 macosx

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

編譯調(diào)試

添加MTObjc運行端

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

16079428223825.jpg

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

編譯調(diào)試好的Objc源碼,其中obcj4-781。

最后編輯于
?著作權(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ù)。

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

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