App啓動後,首先,系統內核(Kernel)建立一個進程。 其次,加載可執行文件。(可執行文件是指Mach-O格式的文件,也就是App中全部.o文件的集合體)這時,能獲取到dyld(dyld是蘋果的動態連接器)的路徑。 而後,加載dyld,主要分爲4步: 1 . load dylibs:這一階段dyld會分析應用依賴的dylib,找到其mach-o文件,打開和讀取這些文件並驗證其有效性,接着會找到代碼簽名註冊到內核,最後對dylib的每個segment調用mmap()。 2 . rebase/bind:進行rebase指針調整和bind符號綁定。 3 . ObjC setup:runtime運行時初始化。包括ObjC相關Class的註冊、category註冊、selector惟一性檢查等。 4 . Initializers:調用每一個ObjC類與分類的+load方法,調用attribute((constructor))修飾的函數、建立C++靜態全局變量。後端
www.jianshu.com/p/d94696155…markdown
預處理:Clang會預處理你的代碼,好比把宏嵌入到對應的位置、註釋被刪除,條件編譯被處理 詞法分析:詞法分析器讀入源文件的字符流,將他們組織稱有意義的詞素(lexeme)序列,對於每一個詞素,詞法分析器產生詞法單元(token)做爲輸出。而且會用Loc來記錄位置。 語法分析:這一步是把詞法分析生成的標記流,解析成一個抽象語法樹(abstract syntax tree -- AST),一樣地,在這裏面每一節點也都標記了其在源碼中的位置。 AST 是抽象語法樹,結構上比代碼更精簡,遍歷起來更快,因此使用 AST 可以更快速地進行靜態檢查。 靜態分析:把源碼轉化爲抽象語法樹以後,編譯器就能夠對這個樹進行靜態分析處理。靜態分析會對代碼進行錯誤檢查,如出現方法被調用可是未定義、定義可是未使用的變量等,以此提升代碼質量。固然,還能夠經過使用 Xcode 自帶的靜態分析工具(Product -> Analyze)進行手動分析。最後 AST 會生成 IR,IR 是一種更接近機器碼的語言,區別在於和平臺無關,經過 IR 能夠生成多份適合不一樣平臺的機器碼。 靜態分析的階段會進行類型檢查,好比給屬性設置一個與其自身類型不相符的對象,編譯器會給出一個可能使用不正確的警告。在此階段也會檢查時候有未使用過的變量等。 中間代碼生成和優化:此階段LLVM 會對代碼進行編譯優化,例如針對全局變量優化、循環優化、尾遞歸優化等,最後輸出彙編代碼xx.ll文件。 生成彙編代碼: 彙編器LLVM會將彙編碼轉爲機器碼。此時的代碼就是.o文件,即二進制文件。 連接:鏈接器把編譯產生的.o文件和(dylib,a,tbd)文件,生成一個mach-o文件。mach-o文件級可執行文件。編譯過程所有結束,生成了可執行文件Mach-O函數