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

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

先提供一份我已經(jīng)編譯好的可執(zhí)行源碼github,用著好給兄弟來個贊哈唇礁!

Objc源碼編譯

如果想做一個有追求的程序員虹钮,那就需要自己來編譯一份可執(zhí)行源碼魄藕,等以后Apple更新了源碼庫也可以不求人簸淀,自己擼了目胡。

依賴準備

企業(yè)微信截圖_5b2019c9-9831-469d-bf53-f46abf675a7c.png

依賴資源下載:

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

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

初次編譯

打開objc源碼進行第一次編譯戒职,會發(fā)現(xiàn)編譯報錯:


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

第一步

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


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


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

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

第二步

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

  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這兩個方法會報錯搜变,應該是出現(xiàn)了重復定義,這這兩個方法注釋就可以了
  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

至此文件缺少問題都已經(jīng)解決了挠他。

最終文件結構

第三步 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是蘋果內(nèi)部開發(fā)者的系統(tǒng)描述名稱。
大功告成

到了這一步篡帕,大膽的command + b吧<ㄉ纭!赂苗!

objc 編譯調(diào)試

  • 新建一個 Target : HRTest


  • 綁定二進制依賴關系


完成

現(xiàn)在就可以進入main.m開始調(diào)試之路了愉耙。

參考資料

最新Runtime源碼objc4-750編譯
最新macOS 10.15下objc4-779.1源碼編譯調(diào)試

2021.6.7 補充 objc4-818 源碼編譯

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赌渣,隨后出現(xiàn)的幾起案子魏铅,更是在濱河造成了極大的恐慌,老刑警劉巖坚芜,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览芳,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸿竖,警方通過查閱死者的電腦和手機沧竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缚忧,“玉大人悟泵,你說我怎么就攤上這事∩了” “怎么了糕非?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長球榆。 經(jīng)常有香客問我朽肥,道長,這世上最難降的妖魔是什么持钉? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任鞠呈,我火速辦了婚禮,結果婚禮上右钾,老公的妹妹穿的比我還像新娘蚁吝。我一直安慰自己,他們只是感情好舀射,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布窘茁。 她就那樣靜靜地躺著,像睡著了一般脆烟。 火紅的嫁衣襯著肌膚如雪山林。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天邢羔,我揣著相機與錄音驼抹,去河邊找鬼。 笑死拜鹤,一個胖子當著我的面吹牛框冀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敏簿,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼明也,長吁一口氣:“原來是場噩夢啊……” “哼宣虾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起温数,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绣硝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撑刺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹉胖,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年够傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了甫菠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡王带,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出市殷,到底是詐尸還是另有隱情愕撰,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布醋寝,位于F島的核電站搞挣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏音羞。R本人自食惡果不足惜囱桨,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗅绰。 院中可真熱鬧舍肠,春花似錦、人聲如沸窘面。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽财边。三九已至肌括,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酣难,已是汗流浹背谍夭。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憨募,地道東北人紧索。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像菜谣,于是被迫代替她去往敵國和親齐板。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353