關于architecture以及xcode編譯
目前市面上的蘋果手機主要cpu架構有armv7,arm7s,arm64,iPhone5是armv7s,之前的3GS/4/4S都是armv7,之后5s/6/6S/7/7S就都是arm64。
xcode編譯選項中,有幾個關于architecture的選項,xcode要編譯的目標架構是valid architecture和active architecture的交集。xcode會對所有支持的架構進行編譯,生成所有的.o文件鏈接成.a。不同架構的.a最后再合在一起,形成最后的.a 或二進制文件。
所以如果你的工程支持armv7/7S/64,編譯器是要編譯鏈接三次的,最后包的大小也是3倍。目前流行的兩種架構是armv7和arm64,主流的app都只支持這兩個。armv7s因為只有iPhone5,所以現在xcode默認的standard architecture已經沒有這個架構了。iPhone5降級運行armv7的代碼,執行效率差別不大。
值得一提的是,我們國人一直在使用,一直在抱怨的購票app 12306,我拆開包研究了下,竟然只支持armv7架構。所以在搶票這個環節,你用iPhone4S和iPhone7,CPU執行的效率是一樣的,體現了大國的公平精神。
分析處理二進制文件的神器 lipo
lipo是一個分析處理二進制文件的工具,你可以把多種架構的.a合并成一個.a,也可以把一個混合的.a中提取某一種架構的.a,或者去掉某一種。通常如果拿到第三方庫調試,如果遇到找不到某個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架構從混合lib中提取出來,后一個是去掉arm64的架構。前兩個有區別,thin直接提取成non-fat文件,extract和remove則直接提取出對應的.a,還是fat格式的文件。接下來使用ar命令的前提是non-fat文件,所以只能使用thin。
提取.o文件
lipo更多的是針對fat文件進行的處理,基于architecture級別的。
如果要把一個二進制文件里面的.o 文件全部提取出來,可以使用ar工具,具體可以看man手冊。
值得注意的是,不管是從appstore下載的還是inhouse安裝的,都是經過加殼處理的,ar就無能為力了。所以先去學習如何脫殼吧,這是客戶端的另外一個方向 -- 逆向工程。我也不會。。。找時間學習啦。。。