关于architecture以及两个相关工具
关于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就无能为力了。所以先去学习如何脱壳吧,这是客户端的另外一个方向 -- 逆向工程。我也不会。。。找时间学习啦。。。