最新Runtime源碼objc4-750編譯


最新版本的Runtime源碼已經(jīng)出來(lái)了毡惜,是不急不可耐的想用用它呢?在這里我將一步步教大家如何編譯它祈噪,首先貼個(gè)自己的環(huán)境配置:

  • mac OS 10.14
  • Xcode 10.1
  • objc4-750

首先給出我已編譯好的objc4-750地址粥鞋,可以直接使用派殷。

Runtime源碼地址

  • 蘋(píng)果開(kāi)源網(wǎng)站上可以下載到很多開(kāi)源項(xiàng)目瞻佛,可以看到當(dāng)前最新mac OS系統(tǒng)為10.14.1传黄,最新的Xcode版本為10俏站,安裝Xcode 10.0提示mac OS系統(tǒng)需要10.13.6:
  • 通常所說(shuō)的Runtime源碼就是objc4文件枣氧,由于iOS中開(kāi)源項(xiàng)目非常少辜伟,所以選擇最新mac OS系統(tǒng)10.14.1铲觉,command+f鍵在瀏覽器頁(yè)面右上角輸入objc4:
  • 可以看到最新的objc4文件為objc4-750.1窝稿,點(diǎn)擊右邊的下載按鈕可以下載壓縮包:
  • 也可以點(diǎn)擊objc4-750.1野揪,可以看到包里的具體內(nèi)容访忿,用Xcode可以打開(kāi)它:


  • 此時(shí)顯示的網(wǎng)頁(yè)地址為https://opensource.apple.com/source/objc4/objc4-750.1/
  • 去掉最后的objc4-750.1/路徑,進(jìn)入網(wǎng)頁(yè)地址https://opensource.apple.com/source/objc4/斯稳,可以看到以往objc4歷史版本:
  • 其中source替換成tarballs海铆,http://opensource.apple.com/tarballs/objc4/,就可以下載自己想要的objc4版本:

Runtime源碼編譯

下載好源碼之后用Xcode打開(kāi)是這個(gè)樣子:


這里的libobjc.A.dylib就是我們要編譯的目標(biāo)-Runtime庫(kù)挣惰,編譯好之后自己可以再添加一個(gè)Target用于測(cè)試?yán)锩娴腞untime源碼卧斟,但是現(xiàn)在編譯會(huì)報(bào)錯(cuò)殴边,大部分錯(cuò)誤是缺少頭文件,這些頭文件都在蘋(píng)果開(kāi)源的其它項(xiàng)目里珍语。接下來(lái)依依解決這些問(wèn)題:

  1. 準(zhǔn)備工作
    進(jìn)入蘋(píng)果開(kāi)源網(wǎng)站锤岸,下載依賴(lài)的開(kāi)源項(xiàng)目:
  • Libc-825.40.1.tar.gz
  • dyld-551.3.tar.gz
  • libauto-187.tar.gz
  • libclosure-73.tar.gz
  • libdispatch-1008.220.2.tar.gz
  • xnu-4903.221.2.tar.gz
  • libpthread-330.220.2.tar.gz
  • launchd-842.92.1.tar.gz
  • libplatform-177.200.16.tar.gz
    把他們下載好并解壓之后放入同一個(gè)文件夾中,方便查找板乙。
  1. 提示'sys/reason.h' file not found
    在當(dāng)前項(xiàng)目下創(chuàng)建一個(gè)文件夾Common是偷,里面用于存放所有缺失的頭問(wèn)題件:

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

接下來(lái)需要去已下載好的開(kāi)源項(xiàng)目中尋找reason.h頭文件了,方式有兩種:

  • 使用命令行:
    進(jìn)入目錄cd /Users/gcf/Desktop/OpenSource
    搜索文件名find . -name ‘reason.h’
    image.png

    可以看到搜索結(jié)果顯示在./xnu-4903.221.2/bsd/sys/reason.h中放接,按照這個(gè)路徑找到reason.h文件刺啦,根據(jù)編譯錯(cuò)誤提示知道,這個(gè)reason.h文件在路徑sys下纠脾,那么在已創(chuàng)建的Common文件下創(chuàng)建一個(gè)新的sys文件夾玛瘸,里面放入找到的reason.h文件:

  • 普通搜索
    直接在Opensource中搜索reason.h文件:

    接下來(lái)處理和上述一樣。
  1. 再次編譯苟蹈,提示'mach-o/dyld_priv.h' file not found
    選擇./dyld-551.3/include/mach-o/dyld_priv.h糊渊,和上述同樣操作,不再重述汉操。
  2. 提示'os/lock_private.h' file not found
    選擇./libplatform-177.200.16/private/os/lock_private.h
  3. 提示'os/base_private.h' file not found
    選擇./libplatform-177.200.16/private/os/base_private.h
  4. 提示'pthread/tsd_private.h' file not found
    選擇./libpthread-330.220.2/private/tsd_private.h
  5. 提示'System/machine/cpu_capabilities.h' file not found
    選擇./xnu-4903.221.2/osfmk/machine/cpu_capabilities.h
  6. 提示'os/tsd.h' file not found
    選擇./xnu-4903.221.2/libsyscall/os/tsd.h
  7. 提示'pthread/spinlock_private.h' file not found
    選擇./libpthread-330.220.2/private/spinlock_private.h
  8. 提示'System/pthread_machdep.h' file not found
    選擇./Libc-825.40.1 2/pthreads/pthread_machdep.h
  9. 提示Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int’))
    這種redefinition錯(cuò)誤時(shí)再来,在include文件夾下使用grep命令:
// 如 重復(fù)定義 pthread_lock_t
grep -rne "typedef.*pthread_lock_t” .
// 輸出
./pthread/spinlock_private.h:59:typedef volatile OSSpinLock pthread_lock_t __deprecated_msg("Use <os/lock.h> instead”);
./System/pthread_machdep.h:214:typedef int pthread_lock_t;

可以看見(jiàn)有兩處定義了pthread_lock_t,注釋掉pthread_machdep.h文件中的定義即可磷瘤。

  1. 提示Static declaration of '_pthread_getspecific_direct' follows non-static declaration
    這里有三個(gè)函數(shù)定義重復(fù)了:
  • _pthread_has_direct_tsd(void)
  • _pthread_getspecific_direct(unsigned long slot)
  • _pthread_setspecific_direct(unsigned long slot, void * val)
grep -re "_pthread_has_direct_tsd(void)” .
//輸出
./pthread/tsd_private.h:_pthread_has_direct_tsd(void)
./System/pthread_machdep.h:_pthread_has_direct_tsd(void)
 grep -re "_pthread_getspecific_direct(unsigned long slot)” .
//輸出
./pthread/tsd_private.h:_pthread_getspecific_direct(unsigned long slot)
./System/pthread_machdep.h:_pthread_getspecific_direct(unsigned long slot)
grep -re "_pthread_setspecific_direct(unsigned long slot, void \* val)” .
//輸出
./pthread/tsd_private.h:_pthread_setspecific_direct(unsigned long slot, void * val)
./System/pthread_machdep.h:_pthread_setspecific_direct(unsigned long slot, void * val)

這里選擇把pthread_machdep.h文件中的定義注釋掉芒篷。

  1. 提示'CrashReporterClient.h' file not found
    選擇./Libc-825.40.1 2/include/CrashReporterClient.h,放入Common文件夾下之后還是報(bào)錯(cuò)采缚,需要在Build Settings->Preprocessor Macros中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
  2. 提示'Block_private.h' file not found
    選擇./libdispatch-1008.220.2/src/BlocksRuntime/Block_private.h
  3. 提示'objc-shared-cache.h' file not found
    選擇./dyld-551.3/include/objc-shared-cache.h
  4. 提示Use of undeclared identifier ‘DYLD_MACOSX_VERSION_10_13
    在 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. 提示'_simple.h' file not found
    選擇./libplatform-177.200.16/private/_simple.h
  2. 提示'isa.h' file not found
    isa.h文件在項(xiàng)目的runtime文件夾中针炉,新加入的一個(gè)頭文件:

    我們把它引入Commone文件夾中去:
  3. 提示can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/AppleInternal/OrderFiles/libobjc.order
    修改工程配置,將Build Settings->Linking->Order File改為工程根目錄下的libobjc.order扳抽,即:$(SRCROOT)/libobjc.order篡帕。
  4. 提示library not found for -lCrashReporterClient
    此時(shí)在 Build Settings -> Linking -> Other Linker Flags里刪掉"-lCrashReporterClient"(Debug和Release都刪了)
  5. 提示SDK "macosx.internal" cannot be located.unable to find utility "clang++", not a developer tool or in PATH
    把Target-objcBuild Phases->Run Script(markgc)里的內(nèi)容macosx.internal改為macosx,這里我猜測(cè)macosx.internal為蘋(píng)果內(nèi)部的macosx贸呢,說(shuō)的不對(duì)镰烧,大家指出來(lái)。
  6. 提示no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes’
    這里需要把Target-objcBuild Settings->Other Text-Based InstallAPI Flags里的內(nèi)容設(shè)為!

    并且一定記得要把Text-Based InstallAPI Verification Model里的值改為Errors Only

相關(guān)警告

  1. 警告Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'objc-trampolines')Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'objc’)
    在項(xiàng)目Target->objc-trampolinesobjc中的Build Settings下設(shè)置ALWAYS_SEARCH_USER_PATHSNo楞陷。
  2. 警告'_PTHREAD_TSD_SLOT_PTHREAD_SELF' macro redefined
    pthread_machdep.h頭文件中共有四個(gè)宏定義重復(fù)了:
  • _PTHREAD_TSD_SLOT_PTHREAD_SELF
  • __PTK_LIBC_TTYNAME_KEY
  • LOCK_INIT
  • LOCK_INITIALIZER
    這里選擇把pthread_machdep.h文件中的宏定義注釋掉怔鳖。
  1. 警告objc-exception.mm:584:5: Code will never be executed
    把不會(huì)執(zhí)行到的代碼__builtin_trap();注釋掉
  2. 警告objc-class.mm:558:33: Possible misuse of comma operator here
    使用Xcode提示的Fix修復(fù)
  3. 還有一些Fixme...之類(lèi)的警告,是蘋(píng)果在自己代碼里定義的一些警告提示固蛾,就不處理了结执。

添加Debug Target

  1. 添加一個(gè)target 取名為 objc-test


  2. 為改target添加工程依賴(lài)


  3. 在objc-test中添加測(cè)試代碼
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Class newClass = objc_allocateClassPair(objc_getClass("NSObject"), "newClass", 0);
                objc_registerClassPair(newClass);
        id newObject = [[newClass alloc]init];
        NSLog(@"%@",newObject);
    }
    return 0;
}

參考文章:

總結(jié)

  1. 所有頭文件


  2. 所有其它開(kāi)源項(xiàng)目


  3. 推薦給技巧度陆,從別人博客中看到的:
    當(dāng)缺少頭文件時(shí),不知道在哪個(gè)開(kāi)源項(xiàng)目中献幔,比如缺少CrashReporterClient.h懂傀,那么在谷歌中輸入CrashReporterClient.h site:opensource.apple.com,搜索結(jié)果:
    看搜索結(jié)果的鏈接蜡感,很容易可知道它來(lái)自Libc項(xiàng)目蹬蚁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铸敏,隨后出現(xiàn)的幾起案子缚忧,更是在濱河造成了極大的恐慌,老刑警劉巖杈笔,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糕非,居然都是意外死亡蒙具,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)朽肥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禁筏,“玉大人,你說(shuō)我怎么就攤上這事衡招±槲簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵始腾,是天一觀的道長(zhǎng)州刽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浪箭,這世上最難降的妖魔是什么穗椅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮奶栖,結(jié)果婚禮上匹表,老公的妹妹穿的比我還像新娘。我一直安慰自己宣鄙,他們只是感情好袍镀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冻晤,像睡著了一般苇羡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上明也,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天宣虾,我揣著相機(jī)與錄音惯裕,去河邊找鬼。 笑死绣硝,一個(gè)胖子當(dāng)著我的面吹牛蜻势,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹉胖,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼握玛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了甫菠?” 一聲冷哼從身側(cè)響起挠铲,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寂诱,沒(méi)想到半個(gè)月后拂苹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痰洒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瓢棒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丘喻。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脯宿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泉粉,到底是詐尸還是另有隱情连霉,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布嗡靡,位于F島的核電站跺撼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叽躯。R本人自食惡果不足惜财边,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望点骑。 院中可真熱鬧酣难,春花似錦、人聲如沸黑滴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袁辈。三九已至菜谣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尾膊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工媳危, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冈敛。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓待笑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抓谴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子暮蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 最新版本的Runtime源碼已經(jīng)出來(lái)了,是不急不可耐的想用用它呢癌压?在這里我將一步步教大家如何編譯它仰泻,首先貼個(gè)自己的...
    Cooci_和諧學(xué)習(xí)_不急不躁閱讀 3,721評(píng)論 8 19
  • 1、準(zhǔn)備工作 2滩届、下載源碼 --https://opensource.apple.com/tarballs/obj...
    青年fw閱讀 907評(píng)論 0 0
  • 目前objc4最新的源碼是750.1版本集侯,看網(wǎng)上也沒(méi)人寫(xiě)了這個(gè)版本的編譯方法,所以這里記錄一下丐吓。編譯方法都大同小異...
    政在coding閱讀 1,053評(píng)論 1 1
  • 前言 相信各位iOS開(kāi)發(fā)愛(ài)好者券犁,都會(huì)想研究一下runtime底層的一些東西,那么最好的方式莫過(guò)于調(diào)試汹碱。蘋(píng)果其實(shí)開(kāi)源...
    己庚辛壬癸閱讀 3,384評(píng)論 14 15
  • 9/365 情緒流經(jīng)——回到真相——做零極限和解 今天中午在姑姑家吃飯粘衬,她的兒媳婦問(wèn)我的兒子學(xué)習(xí)成績(jī)?cè)趺礃樱坑袥](méi)有...
    風(fēng)清云淡_8b20閱讀 332評(píng)論 0 0