關(guān)于architecture以及兩個(gè)相關(guān)工具

關(guān)于architecture以及xcode編譯

目前市面上的蘋果手機(jī)主要cpu架構(gòu)有armv7,arm7s,arm64,iPhone5是armv7s,之前的3GS/4/4S都是armv7,之后5s/6/6S/7/7S就都是arm64。

xcode編譯選項(xiàng)中,有幾個(gè)關(guān)于architecture的選項(xiàng),xcode要編譯的目標(biāo)架構(gòu)是valid architecture和active architecture的交集。xcode會(huì)對(duì)所有支持的架構(gòu)進(jìn)行編譯,生成所有的.o文件鏈接成.a。不同架構(gòu)的.a最后再合在一起,形成最后的.a 或二進(jìn)制文件。

所以如果你的工程支持armv7/7S/64,編譯器是要編譯鏈接三次的,最后包的大小也是3倍。目前流行的兩種架構(gòu)是armv7和arm64,主流的app都只支持這兩個(gè)。armv7s因?yàn)橹挥衖Phone5,所以現(xiàn)在xcode默認(rèn)的standard architecture已經(jīng)沒有這個(gè)架構(gòu)了。iPhone5降級(jí)運(yùn)行armv7的代碼,執(zhí)行效率差別不大。

值得一提的是,我們國(guó)人一直在使用,一直在抱怨的購(gòu)票app 12306,我拆開包研究了下,竟然只支持armv7架構(gòu)。所以在搶票這個(gè)環(huán)節(jié),你用iPhone4S和iPhone7,CPU執(zhí)行的效率是一樣的,體現(xiàn)了大國(guó)的公平精神。

分析處理二進(jìn)制文件的神器 lipo

lipo是一個(gè)分析處理二進(jìn)制文件的工具,你可以把多種架構(gòu)的.a合并成一個(gè).a,也可以把一個(gè)混合的.a中提取某一種架構(gòu)的.a,或者去掉某一種。通常如果拿到第三方庫(kù)調(diào)試,如果遇到找不到某個(gè)architecture的錯(cuò)誤,可以使用這個(gè)工具來查看定位。

lipo -info lib1.a

lipo -detailed_info lib1.a

顯示.a中包含所有的arch type


lipo -create lib1.a lib2.a lib3.a -output liball.a

把三個(gè)lib a, b, c合并成一個(gè)lib


lipo -thin arm64 lib1.a -output libarm64.a

lipo -extract arm64 lib1.a -output libarm64.a

lipo -remove arm64 lib1.a -output libarm7.a

前兩個(gè)是把lib1.a中的arm64架構(gòu)從混合lib中提取出來,后一個(gè)是去掉arm64的架構(gòu)。前兩個(gè)有區(qū)別,thin直接提取成non-fat文件,extract和remove則直接提取出對(duì)應(yīng)的.a,還是fat格式的文件。接下來使用ar命令的前提是non-fat文件,所以只能使用thin。

提取.o文件

lipo更多的是針對(duì)fat文件進(jìn)行的處理,基于architecture級(jí)別的。

如果要把一個(gè)二進(jìn)制文件里面的.o 文件全部提取出來,可以使用ar工具,具體可以看man手冊(cè)。

值得注意的是,不管是從appstore下載的還是inhouse安裝的,都是經(jīng)過加殼處理的,ar就無能為力了。所以先去學(xué)習(xí)如何脫殼吧,這是客戶端的另外一個(gè)方向 -- 逆向工程。我也不會(huì)。。。找時(shí)間學(xué)習(xí)啦。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容