最新Runtime源碼objc4-750編譯


最新版本的Runtime源碼已經出來了,是不急不可耐的想用用它呢?在這里我將一步步教大家如何編譯它,首先貼個自己的環境配置:

  • mac OS 10.14
  • Xcode 10.1
  • objc4-750

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

Runtime源碼地址

  • 蘋果開源網站上可以下載到很多開源項目,可以看到當前最新mac OS系統為10.14.1,最新的Xcode版本為10,安裝Xcode 10.0提示mac OS系統需要10.13.6:
  • 通常所說的Runtime源碼就是objc4文件,由于iOS中開源項目非常少,所以選擇最新mac OS系統10.14.1,command+f鍵在瀏覽器頁面右上角輸入objc4:
  • 可以看到最新的objc4文件為objc4-750.1,點擊右邊的下載按鈕可以下載壓縮包:
  • 也可以點擊objc4-750.1,可以看到包里的具體內容,用Xcode可以打開它:


  • 此時顯示的網頁地址為https://opensource.apple.com/source/objc4/objc4-750.1/
  • 去掉最后的objc4-750.1/路徑,進入網頁地址https://opensource.apple.com/source/objc4/,可以看到以往objc4歷史版本:
  • 其中source替換成tarballs,http://opensource.apple.com/tarballs/objc4/,就可以下載自己想要的objc4版本:

Runtime源碼編譯

下載好源碼之后用Xcode打開是這個樣子:


這里的libobjc.A.dylib就是我們要編譯的目標-Runtime庫,編譯好之后自己可以再添加一個Target用于測試里面的Runtime源碼,但是現在編譯會報錯,大部分錯誤是缺少頭文件,這些頭文件都在蘋果開源的其它項目里。接下來依依解決這些問題:

  1. 準備工作
    進入蘋果開源網站,下載依賴的開源項目:
  • 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
    把他們下載好并解壓之后放入同一個文件夾中,方便查找。
  1. 提示'sys/reason.h' file not found
    在當前項目下創建一個文件夾Common,里面用于存放所有缺失的頭問題件:

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

接下來需要去已下載好的開源項目中尋找reason.h頭文件了,方式有兩種:

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

    可以看到搜索結果顯示在./xnu-4903.221.2/bsd/sys/reason.h中,按照這個路徑找到reason.h文件,根據編譯錯誤提示知道,這個reason.h文件在路徑sys下,那么在已創建的Common文件下創建一個新的sys文件夾,里面放入找到的reason.h文件:

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

    接下來處理和上述一樣。
  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錯誤時,在include文件夾下使用grep命令:
// 如 重復定義 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;

可以看見有兩處定義了pthread_lock_t,注釋掉pthread_machdep.h文件中的定義即可。

  1. 提示Static declaration of '_pthread_getspecific_direct' follows non-static declaration
    這里有三個函數定義重復了:
  • _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文件夾下之后還是報錯,需要在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文件在項目的runtime文件夾中,新加入的一個頭文件:

    我們把它引入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
    此時在 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)里的內容macosx.internal改為macosx,這里我猜測macosx.internal為蘋果內部的macosx,說的不對,大家指出來。
  6. 提示no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes’
    這里需要把Target-objcBuild Settings->Other Text-Based InstallAPI Flags里的內容設為!

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

相關警告

  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’)
    在項目Target->objc-trampolinesobjc中的Build Settings下設置ALWAYS_SEARCH_USER_PATHSNo。
  2. 警告'_PTHREAD_TSD_SLOT_PTHREAD_SELF' macro redefined
    pthread_machdep.h頭文件中共有四個宏定義重復了:
  • _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
    把不會執行到的代碼__builtin_trap();注釋掉
  2. 警告objc-class.mm:558:33: Possible misuse of comma operator here
    使用Xcode提示的Fix修復
  3. 還有一些Fixme...之類的警告,是蘋果在自己代碼里定義的一些警告提示,就不處理了。

添加Debug Target

  1. 添加一個target 取名為 objc-test


  2. 為改target添加工程依賴


  3. 在objc-test中添加測試代碼
#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;
}

參考文章:

總結

  1. 所有頭文件


  2. 所有其它開源項目


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

推薦閱讀更多精彩內容

  • 最新版本的Runtime源碼已經出來了,是不急不可耐的想用用它呢?在這里我將一步步教大家如何編譯它,首先貼個自己的...
    Cooci_和諧學習_不急不躁閱讀 3,776評論 8 19
  • 1、準備工作 2、下載源碼 --https://opensource.apple.com/tarballs/obj...
    青年fw閱讀 928評論 0 0
  • 目前objc4最新的源碼是750.1版本,看網上也沒人寫了這個版本的編譯方法,所以這里記錄一下。編譯方法都大同小異...
    政在coding閱讀 1,076評論 1 1
  • 前言 相信各位iOS開發愛好者,都會想研究一下runtime底層的一些東西,那么最好的方式莫過于調試。蘋果其實開源...
    己庚辛壬癸閱讀 3,408評論 14 15
  • 9/365 情緒流經——回到真相——做零極限和解 今天中午在姑姑家吃飯,她的兒媳婦問我的兒子學習成績怎么樣?有沒有...
    風清云淡_8b20閱讀 344評論 0 0