1.是什么?
蘋(píng)果在WWDC 2015大會(huì)上引入了bitcode孝赫,隨后在Xcode7中添加了在二進(jìn)制中嵌入bitcode(Enable Bitcode)的功能较木,并且默認(rèn)設(shè)置為開(kāi)啟狀態(tài)。
bitcode是由LLVM引入的一種中間代碼(Intermediate Representation寒锚,簡(jiǎn)稱(chēng)IR)劫映,它是源代碼被編譯為二進(jìn)制機(jī)器碼過(guò)程中的中間表示形態(tài),它既不是源代碼刹前,也不是機(jī)器碼泳赋。從代碼組織結(jié)構(gòu)上看它比較接近機(jī)器碼,但是在函數(shù)和指令層面使用了很多高級(jí)語(yǔ)言的特性喇喉。
編譯過(guò)程
前端(Frontend)祖今,負(fù)責(zé)把各種類(lèi)型的源代碼編譯為中間表示,也就是bitcode拣技,在LLVM體系內(nèi)千诬,不同的語(yǔ)言有不同的編譯器前端,最常見(jiàn)的如clang負(fù)責(zé)c/c++/oc的編譯膏斤,flang負(fù)責(zé)fortran的編譯徐绑,swiftc負(fù)責(zé)swift的編譯等等
優(yōu)化(Optimizer),負(fù)責(zé)對(duì)bitcode進(jìn)行各種類(lèi)型的優(yōu)化莫辨,將bitcode代碼進(jìn)行一些邏輯等價(jià)的轉(zhuǎn)換傲茄,使得代碼的執(zhí)行效率更高,體積更小沮榜,比如DeadStrip/SimplifyCFG
后端(Backend)盘榨,也叫CodeGenerator,負(fù)責(zé)把優(yōu)化后的bitcode編譯為指定目標(biāo)架構(gòu)的機(jī)器碼蟆融,比如X86Backend負(fù)責(zé)把bitcode編譯為x86指令集的機(jī)器碼
2.使用和遇到的問(wèn)題
Enable Bitcode:設(shè)置YES Or NO
或者使用Other linker flags:(編譯鏈接參數(shù))
-fembed-bitcode 打包出bitcode
-fembed-bitcode-marker 假裝打包出了bitcode草巡,但真實(shí)時(shí)bitcode使用一個(gè)字節(jié)的占位符 0x00
3.bitcode的兼容性
bitcode的格式目前是一直在變化的,并且無(wú)法向前兼容型酥,舉例來(lái)說(shuō)Xcode8的編譯器無(wú)法讀取并解析xcode9產(chǎn)生的bitcode山憨。