OC底層探索02- objc4-781 源碼編譯

在蘋果opensource上提供了所有objc版本的源碼,但是建議使用該地址release版本進入搜索objc即可下載正式版本.

先提供一份我已經編譯好的可執行源碼github,用著好給兄弟來個贊哈!

Objc源碼編譯

如果想做一個有追求的程序員,那就需要自己來編譯一份可執行源碼,等以后Apple更新了源碼庫也可以不求人,自己擼了。

依賴準備

企業微信截圖_5b2019c9-9831-469d-bf53-f46abf675a7c.png

依賴資源下載:

源碼下載:objc-781
其他依賴庫:OpenSource
Libc-825.40

除了Libc-825.40都可以從第一個鏈接下載.因為objc4-781也是在這個macOS 10.15.1版本放出的。當然應該也可以使用更高版本的相關庫,但我這面防止有兼容問題就沒有使用了,有興趣的可以試一下。

初次編譯

打開objc源碼進行第一次編譯,會發現編譯報錯:


很明顯是缺少文件,這時候就需要用到之前下載的依賴庫了。

第一步

這里推薦一個mac搜索軟件:Alfred很好用。


通過這個軟件直接找到對應文件。


根據上圖中的順序創建文件:sys這個文件夾名不得隨意更改,需要跟報錯處保持一致,最后把文件拷入。

并且把它添加到項目的Header Search Paths中,依次選擇objc->TARGETS->objc->Build Settings,搜索框中輸入header search path,然后加入$(SRCROOT)/HRCommon

第二步

繼續編譯依舊會報錯,下方錯誤處理方式與第一步相同,不在贅述,但是需要注意的是文件的拷貝路徑需要和報錯文件的路徑一致:

  1. 提示mach-o/dyld_priv.h file not found
    選擇./dyld-733.6/include/mach-o/dyld_priv.h

    • 拷貝后,還需要修改 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
  1. 提示mach-o/dyld_priv.h file not found
    選擇./dyld-733.6/include/mach-o/dyld_priv.h

    • 該文件中的bridgeos(3.0)會報錯,直接刪除即可
  2. 提示pthread/tsd_private.h file not found
    選擇./libpthread-416.40.3/private/tsd_private.h

  3. 提示pthread/spinlock_private.h file not found
    選擇./libpthread-416.40.3/private/spinlock_private.h

  4. 提示os/lock_private.h file not found
    選擇./libplatform-200/private/os/lock_private.h

  5. 提示System/machine/cpu_capabilities.h file not found
    選擇./xnu-6153.41.3/osfmk/machine/cpu_capabilities.h

  6. 提示os/tsd.h file not found
    選擇./xnu-6153.41.3/libsyscall/os/tsd.h

  7. 提示System/pthread_machdep.h file not found
    選擇./Libc-825.40.1/pthreads/pthread_machdep.h

    • 該文件中會有報錯_pthread_getspecific_direct,_pthread_setspecific_direct這兩個方法會報錯,應該是出現了重復定義,這這兩個方法注釋就可以了
  8. 提示CrashReporterClient.h file not found
    選擇./Libc-825.40.1/include/CrashReporterClient.h

    • 導入后還是報錯,需要通過以下方式解決:- 需要在Build Settings -> Preprocessor Macros 中加入LIBC_NO_LIBCRASHREPORTERCLIENT
  9. 提示objc-shared-cache.h file not found
    選擇./dyld-733.6/include/objc-shared-cache.h

    • 注釋掉objc-runtime.mm中的#error mismatch in debug-ness macros
  10. 提示_simple.h file not found
    選擇./libplatform-220/private/_simple.h

  11. 提示kern/restartable.h file not found
    選擇./xnu-6153.41.3/osfmk/kern/restartable.h

  12. 提示Block_private.h file not found
    選擇./libclosure-74/Block_private.h

至此文件缺少問題都已經解決了。

最終文件結構

第三步 libobjc.order 路徑問題

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
第四步 lCrashReporterClient 編譯不到

Library not found for -lCrashReporterClient

  • 選擇 target -> objc -> Build Settings
  • Other Linker Flags中刪除 -lCrashReporterClient( Debug 和 Release 都刪了)
第五步 Xcode 腳本編譯問題

/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
/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)
/xcrun:1:1: unable to find utility "clang++", not a developer tool or in PATH

  • 選擇 target -> objc -> Build Phases -> Run Script(markgc)
  • 把腳本文本 macosx.internal 改成 macosx
    猜測macosx.internal是蘋果內部開發者的系統描述名稱。
大功告成

到了這一步,大膽的command + b吧!??!

objc 編譯調試

  • 新建一個 Target : HRTest


  • 綁定二進制依賴關系


完成

現在就可以進入main.m開始調試之路了。

參考資料

最新Runtime源碼objc4-750編譯
最新macOS 10.15下objc4-779.1源碼編譯調試

2021.6.7 補充 objc4-818 源碼編譯

最近想要玩一下最新的818源碼,又需要重新進行編譯了。無意中發現這篇寫的挺不錯,偷個懶就直接拿過來了。
objc4-818 源碼編譯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375