静态库
查看静态库对象
$ar -tv libeasy_http_server.a
rw-rw-r-- 59881/59881 2640480 May 28 16:56 2018 http_server_base.o
rw-rw-r-- 59881/59881 907200 May 29 13:29 2018 http_server_base_main.o
rw-rw-r-- 59881/59881 1632424 May 28 16:56 2018 async.o
rw-rw-r-- 59881/59881 2282032 May 28 16:56 2018 future_engine.o
rw-rw-r-- 59881/59881 1691120 May 28 16:56 2018 future.o
创建静态库: ar -rcs test.a *.o
查看静态库: ar -tv test.a
解压静态库: ar -x test.a
查看程序依赖态库: readelf -a xxx|grep library
看面交叉程序hello执行依赖于两态库
rebi@ubuntu:~/test
arm−none−linux−gnueabi−readelf−ahello|grep"library"0x0000000依(NEEDED)Sharedlibrary:[libgccs.so.依]0x0000000依(NEEDED)Sharedlibrary:[libc.so.陆]rebi@ubuntu: /test
a
r
m
−
n
o
n
e
−
l
i
n
u
x
−
g
n
u
e
a
b
i
−
r
e
a
d
e
l
f
−
a
h
e
l
l
o
|
g
r
e
p
"
l
i
b
r
a
r
y
"
0
x
0000000
依
(
N
E
E
D
E
D
)
S
h
a
r
e
d
l
i
b
r
a
r
y
:
[
l
i
b
g
c
c
s
.
s
o
.
依
]
0
x
0000000
依
(
N
E
E
D
E
D
)
S
h
a
r
e
d
l
i
b
r
a
r
y
:
[
l
i
b
c
.
s
o
.
陆
]
r
e
b
i
@
u
b
u
n
t
u
:
/
t
e
s
t
readelf -l hello
查看是否是fPIC编译
readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'
上句大多数时候(和平台有关)可以正确判断是否是以fPIC选项编译的,如果输出为空,基本可以表明不是以fPIC选项编译的,若有输出,基本上表明是以fPIC选项编译的。
另外,由于静态库是多个目标文件的打包,所以最好把静态库解包之后再对每个目标文件进行判断,这样比较准确。
查看库中的符号
nm 查看 .o, .a, *.so中的符号
参数
- -A 在每个符号信息的前面打印所在对象文件名称;
- -C 输出demangle过了的符号名称;
- -D 打印动态符号;
- -l 使用对象文件中的调试信息打印出所在源文件及行号;
- -n 按照地址/符号值来排序;
- -u 打印出那些未定义的符号;
符号类型
- A 该符号的值在今后的链接中将不再改变;
- B 该符号放在BSS段中,通常是那些未初始化的全局变量;
- D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
- T 该符号放在代码段中,通常是那些全局非静态函数;
- U 该符号未定义过,需要自其他对象文件中链接进来;
- W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。
- 将C++源程序标识符(original C++ source identifier)转换成C++ ABI标识符(C++ ABI identifier)的过程称为mangle;相反的过程称为demangle
- -l 时,必须要对象文件中带有符号调式信息(编译的时候加 -g )