objc824源碼編譯

前言

本人最近學(xué)習(xí)iOS底層原理并鸵,需要編譯源碼鸳粉,在這里,記錄一下遇到的問(wèn)題以及處理的過(guò)程园担,因?yàn)槲业南到y(tǒng)是 11.3.1 的届谈,所以我配置的是最新的 objc源碼。

Snip20210527_21.png

這里附上objc源碼地址:https://opensource.apple.com/tarballs/objc4/

一弯汰、 準(zhǔn)備

1疼约、環(huán)境

系統(tǒng):macOS Big Sur - 11.3.1
工具:Xcode 12.5

2、資料

  • dyld-851.27
  • launchd-106.10(需要去mac os 10.4.4中下載)
  • libauto-187
  • Libc-583(需要去macos 10.6.2中去下載)
  • Libc-825.24(需要去macos10.8.1中去下載)
  • Libc-1439.100.3
  • libclosure-79
  • libdispatch-1271.100.5
  • libplatform-254.80.2
  • libpthread-454.100.8
  • xnu-7195.101.1
  • objc4-824
Snip20210527_20.png

以上是需要的材料蝙泼,都可以在 https://opensource.apple.com/releases/ 這里下載。
我也有將這些文件上傳到 git劝枣,下載地址:https://github.com/RegretSF/objc824

二汤踏、 編譯

1、unable to find sdk 'macosx.internal'

把objc824源碼下載下來(lái)之后編譯舔腾,發(fā)現(xiàn)報(bào)錯(cuò):

image.png

解決方法:target → objc/objc-trampolines → Build Setting → Base SDK將其改為macOS溪胶,如圖:
image.png

注意:objc和objc-trampolines的都要改,因?yàn)榫幾g器報(bào)的錯(cuò)誤是這兩個(gè)稳诚。

2哗脖、'os/feature_private.h' file not found

image.png

解決方法:這個(gè)聲明報(bào)錯(cuò)直接注釋掉就好了。

3扳还、'sys/reason.h' file not found

image.png

解決方法:項(xiàng)目目錄新建文件夾 FNCommon才避,這個(gè)文件夾的名字可以隨便取,在 FNCommon 里新建 sys 文件夾氨距,將 xnu-7195.101.1/bsd/sys/ 路徑下的 reason.h 文件放到新建的 FNCommon/sys/目錄下桑逝,如圖:

image.png

但這個(gè)時(shí)候編譯還是會(huì)報(bào)錯(cuò),解決方法:給我們的工程設(shè)置文件檢索路徑俏让,選擇 target -> objc -> Build Settings楞遏,在工程的 Header Serach Paths 中添加搜索路徑 $(SRCROOT)/FNCommon茬暇,如圖:
image.png

4、'mach-o/dyld_priv.h' file not found

image.png

解決方法:其實(shí)方式和第3點(diǎn)一樣寡喝,在 FNCommon 里新建 mach-o 文件夾糙俗,將 dyld-851.27/include/mach-o 路徑下的 dyld_priv.h 文件放到新建的 FNCommon/mach-o/ 目錄下,如圖:
image.png

添加完成了之后预鬓,這里在 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

如圖:


image.png

5巧骚、'os/lock_private.h' file not found

image.png

解決方法:和第3點(diǎn)一樣,在 FNCommon 里新建 os 文件夾珊皿,將 libplatform-254.80.2/private/os 路徑下的 lock_private.h 文件放到新建的 FNCommon/os/ 目錄下网缝,如圖:
image.png

6、bridgeos - 1 報(bào)錯(cuò)

image.png

將有關(guān) bridgeos 報(bào)錯(cuò)的代碼蟋定,刪除掉 bridgeos(3.0)粉臊,如圖:
image.png

到這里先編譯,后面還會(huì)出現(xiàn)有關(guān) bridgeos 報(bào)錯(cuò)的代碼驶兜,到時(shí)候用一樣的方式扼仲,刪除掉 bridgeos即可。

7抄淑、'os/base_private.h' file not found

image.png

解決方法:和第3點(diǎn)一樣屠凶,將 xnu-7195.101.1/libkern/os 路徑下的 base_private.h 文件放到新建的 FNCommon/os/ 目錄下,如圖:
image.png

8肆资、bridgeos - 2 報(bào)錯(cuò)

image.png

解決方法:刪除掉代碼中的 bridgeos(4.0)矗愧,如圖:

image.png

9、'pthread/tsd_private.h' file not found

image.png

解決方法:和第3點(diǎn)一樣郑原,在 FNCommon 里新建 pthread 文件夾唉韭,將 libpthread-454.100.8/private/pthread 路徑下的 tsd_private.h 文件放到新建的 FNCommon/pthread/ 目錄下,如圖:

image.png

10犯犁、'System/machine/cpu_capabilities.h' file not found

image.png

解決方法:和第3點(diǎn)一樣属愤,在 FNCommon 里新建 System 文件夾并在System里新建文件夾machine,將 xnu-7195.101.1/osfmk/machine 路徑下的 cpu_capabilities.h 文件放到新建的 FNCommon/System/machine/ 目錄下酸役,如圖:

image.png

11住诸、'os/tsd.h' file not found

image.png

解決方法:和第5點(diǎn)一樣,將 xnu-7195.101.1/libsyscall/os 路徑下的 tsd.h 文件放到新建的 FNCommon/os/ 目錄下涣澡,如圖:

image.png

12贱呐、'pthread/spinlock_private.h' file not found

image.png

解決方法:和第9點(diǎn)一樣,將 libpthread-454.100.8/private/pthread 路徑下的 spinlock_private.h 文件放到新建的 FNCommon/pthread/ 目錄下入桂,如圖:
image.png

13吼句、'System/pthread_machdep.h' file not found

image.png

解決方法:和第10點(diǎn)一樣,將 Libc-825.24/pthreads 路徑下的 pthread_machdep.h 文件放到新建的 FNCommon/System/ 目錄下事格,如圖:

image.png

添加完成后惕艳,重新編譯搞隐,會(huì)出現(xiàn)幾個(gè)報(bào)錯(cuò),如圖:


image.png

我們直接把報(bào)錯(cuò)的代碼注釋掉远搪,重新編譯就好了劣纲。

14、'CrashReporterClient.h' file not found

image.png

解決方法:將 Libc-825.24/include 路徑下的 CrashReporterClient.h 文件放到新建的 FNCommon/ 目錄下谁鳍,如圖:

image.png

15癞季、'_simple.h' file not found

image.png

解決方法:將 libplatform-254.80.2/private 路徑下的 _simple.h 文件放到新建的 FNCommon/ 目錄下,如圖:

image.png

16倘潜、'Cambria/Traps.h' file not found绷柒, 'Cambria/Cambria.h' file not found

image.png

解決方法:這兩個(gè)聲明直接注釋掉就好了挎塌。

17桐臊、'os/linker_set.h' file not found

image.png

解決方法:將 Libc-1439.100.3/os 路徑下的 linker_set.h 文件放到新建的 FNCommon/os/ 目錄下艾岂,如圖:

image.png

18蔼啦、'kern/restartable.h' file not found

image.png

解決方法:和第3點(diǎn)一樣,在 FNCommon 里新建 kern 文件夾璧微,將 xnu-7195.101.1/osfmk/kern 路徑下的 restartable.h 文件放到新建的 FNCommon/kern/ 目錄下戳吝,如圖:

image.png

19定躏、Use of undeclared identifier 'CRGetCrashLogMessage'澜掩,Use of undeclared identifier 'CRSetCrashLogMessage'

image.png

解決方法:將代碼注釋掉即可购披,如圖:


image.png

20、Use of undeclared identifier 'oah_is_current_process_translated'肩榕,

image.png

解決方法:將代碼注釋掉即可刚陡,如圖:


image.png

21、Use of undeclared identifier 'dyld_fall_2020_os_versions'

image.png

解決方法:將代碼注釋掉即可株汉,如圖:


image.png

image.png

22筐乳、'Block_private.h' file not found

image.png

解決方法:將 ``libclosure-79/路徑下的Block_private.h 文件放到新建的FNCommon/``` 目錄下,如圖:

image.png

23郎逃、Use of undeclared identifier 'dyld_platform_version_macOS_10_13',Use of undeclared identifier 'dyld_platform_version_macOS_10_11'挺份,Use of undeclared identifier 'dyld_fall_2018_os_versions'

image.png

解決方法:將代碼注釋掉即可褒翰,如圖:


image.png

image.png

image.png

24、'objc-shared-cache.h' file not found

image.png

解決方法:將 dyld-851.27/include 路徑下的 objc-shared-cache.h 文件放到新建的 FNCommon/ 目錄下匀泊,如圖:

image.png

25优训、'os/reason_private.h' file not found, 'os/variant_private.h' file not found

image.png

解決方法:將 xnu-7195.101.1/libkern/os 路徑下的 reason_private.h 文件和Libc-1439.100.3/os 路徑下的 reason_private.h 文件放到新建的 FNCommon/os/ 目錄下各聘,如圖:

image.png

26揣非、bridgeos - 3 報(bào)錯(cuò)

image.png

解決方法:將 bridgeos 刪掉即可,其他代碼有也一樣躲因,如圖:

image.png

27早敬、Use of undeclared identifier 'dyld_platform_version_bridgeOS_2_0'...

image.png

解決方法:將有關(guān)的代碼注釋掉即可忌傻,如圖:


image.png

28、'_static_assert' declared as an array with a negative size

image.png

解決方法:將有關(guān)的代碼注釋掉即可搞监,如圖:


image.png

29水孩、ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/AppleInternal/OrderFiles/libobjc.order

image.png

libobjc.order 路徑問(wèn)題。

解決方法:選擇 target -> objc -> Build Settings琐驴,在工程的 Order File 中添加搜索路徑 $(SRCROOT)/libobjc.order俘种,如圖:

image.png

30、library not found for -lCrashReporterClient

image.png

解決方法:需要在 TARGETS -> objc -> Build Settings -> Preprocessor Macros 中加入: LIBC_NO_LIBCRASHREPORTERCLIENT绝淡,如圖:

image.png

如果還是報(bào)錯(cuò)宙刘,找到TARGETS -> objc -> Build Setting -> Other Link Flags,刪除-lCrashReporterClient-loah牢酵,如圖:

image.png

31悬包、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

image.png

解決方法:選擇 target -> objc -> Build Phases -> Run Script(markgc)把腳本文本macosx.internal 改成 macosx玉罐,如圖:

image.png

到這里,就編譯成功啦潘拨!
我已經(jīng)老血吐了一地了吊输!的確配置過(guò)程還是相對(duì)來(lái)說(shuō)有點(diǎn)惡心,尤其是文件的查漏補(bǔ)缺铁追。

三季蚂、 objc 編譯調(diào)試

1、新建一個(gè) Target : FNTest琅束,如圖:

image.png

image.png

image.png

2扭屁、綁定二進(jìn)制依賴(lài)關(guān)系

image.png

運(yùn)行代碼進(jìn)入源碼,可以自由編譯調(diào)試涩禀!


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末料滥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艾船,更是在濱河造成了極大的恐慌葵腹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屿岂,死亡現(xiàn)場(chǎng)離奇詭異践宴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)爷怀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阻肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人运授,你說(shuō)我怎么就攤上這事烤惊∷貉酰” “怎么了瘤缩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵伦泥,是天一觀的道長(zhǎng)府怯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)角钩,這世上最難降的妖魔是什么辫愉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任闸衫,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菩掏。我一直安慰自己患蹂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布砸紊。 她就那樣靜靜地躺著传于,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醉顽。 梳的紋絲不亂的頭發(fā)上沼溜,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音游添,去河邊找鬼系草。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唆涝,可吹牛的內(nèi)容都是我干的找都。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼廊酣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼能耻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晓猛,失蹤者是張志新(化名)和其女友劉穎饿幅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戒职,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栗恩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洪燥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕秤。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捧韵,靈堂內(nèi)的尸體忽然破棺而出亲澡,到底是詐尸還是另有隱情,我是刑警寧澤纫版,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布床绪,位于F島的核電站,受9級(jí)特大地震影響其弊,放射性物質(zhì)發(fā)生泄漏癞己。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一梭伐、第九天 我趴在偏房一處隱蔽的房頂上張望痹雅。 院中可真熱鬧,春花似錦糊识、人聲如沸绩社。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)愉耙。三九已至,卻和暖如春拌滋,著一層夾襖步出監(jiān)牢的瞬間朴沿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工败砂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赌渣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓昌犹,卻偏偏與公主長(zhǎng)得像坚芜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斜姥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容