logo头像

星星給予仰望者光芒

Analysis .a static library

本文于 912 天之前發表,文章内容可能已經過時。

  分析 .a 靜態庫

分析 .a 靜態庫

靜態庫 .a 就是一組 .o 文件的 ar 包,可以用ar -t查看 .a 包含的所有 .o 。

1
ar -x somelib_armv7.a 
1
2
3
4
5
6
7
8
9
➜  CheckBundleIDSDK ar -t libDGCCheckBundleID_arm64.a
__.SYMDEF
1.o
10.o
11.o
12.o
13.o
14.o
....

這是一個經過混淆加密後的 object code:

1
2
3
4
5
6
7
8
9
10
11
➜  CheckBundleIDSDK cat 1.o
����
� �� �__text__TEXT �
%�__StaticInit__TEXT�4
�__cstring__TEXT��__objc_methname__TEXT�^�__objc_classn__mod_init_func__DAT�ype__TEXT
__cfstring__DATA @�
__objc_classlist__DATA�
__objc_imageinfo__DATA__objc_const__DATAp��
__bss__DATA�__asm__LLVM�� __o__compact_unwind__LD�@� `
p�W���O��{������
...

報錯

在解壓縮 .a 文件時,報錯:is a fat file (use libtool(1) or lipo(1) and ar(1) on it),原因是 .a 文件包含了多個 cpu 架構,比如arm64, armv7, armv7s等。

解決方法:首先使用如下指令解壓出需要的架構(其中”CheckBundleIDSDK.a”代表需要解壓的 .a 文件)

1
2
3
4
5
## 解壓縮 64指令集
lipo CheckBundleIDSDK.a -thin arm64 -output somelib_arm64.a

## 解壓縮 v7s指令集
lipo CheckBundleIDSDK.a -thin armv7s -output somelib_armv7s.a

這樣獲得解壓出來的.a(somelib_arm64.a,somelib_armv7s.a)後,再使用如下命令解壓獲得.o文件:

1
ar -x somelib_armv7.a -o 

後記

armv7、armv7s、arm64都是ARM處理器的指令集

i386、x86_64 是Mac處理器的指令集

目前市面上手機幾乎是arm64,故其他可以不用太過關注。

ARM 指令集 設備
arm64

iPhone6s

iphone6s plus

iPhone6

iPhone6 plus

iPhone5S

iPad Air

iPad mini2(iPad mini with Retina Display)

armv7s

iPhone5

iPhone5C

iPad4(iPad with Retina Display)

armv7

iPhone4

iPhone4S

iPad2… 等

i386 是針對 intel 通用微處理器32位處理器

x86_64 是針對 x86 架構的64位處理器

模擬器32位處理器測試需要 i386 架構,

模擬器64位處理器測試需要 x86_64 架構,

真機32位處理器需要 armv7, 或者 armv7s 架構,

真機64位處理器需要 arm64 架構。