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

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

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

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

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

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

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

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

lipo -info lib1.a

lipo -detailed_info lib1.a

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


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

把三個lib a, b, c合并成一個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

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

提取.o文件

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

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

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

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

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

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