linux 库查看工具 ar-nm-ranlib-ldd

时间:2021-05-21 11:00:29
ar [-X32_64] [-]p[mod [relpos] [count]] archive [member...]

-c  create创建归档 
-t  table显示归档中的成员文件名
-v   view显示详细处理过程
-d  delete删除归档中的成员文件
-x extract提取成员文件 不带文件名,默认提取全部
-u update  更新改变的
-r insert  插入文件


#静态库打包
ar -cru libCommon.a *.o

#解包
ar -x libCommon.a

#查看文件
ar -t libCommon.a

ar -tv libCommon.a

#从libCommon.a中删除udp.o 文件
ar -dv libCommon.a udp.o 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=
nm 

1、"-A",列出符号名的时候同时显示来自于哪个文件。
这在同时列出多个文件(比如一个链接库)的符号时比较有用
2、"-a",列出所有符号
这将会把调试符号也列出来。默认状态下调试符号不会被列出。
3、"-l",列出符号在源代码中对应的行号
指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空
4、"-n",根据符号的地址来排序
默认是按符号名称的字母顺序排序的
5、"-u",只列出未定义符号
同"--undefined-only", 而"--defined-only"将只列出已定义符号

#产看函数列表
nm libCommon.a |grep -E ' T|\.o'
#查看动态库列表
nm -D libCommon.so 

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=
ranlib libXX.a
重新生成静态库索引符号表表

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=
ldd 
ldd不是一个可执行程序,而只是一个shell脚本

2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下: LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、 LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的 dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
(2) 再执行任何的程序,如ls等,看看程序的运行结果

3、ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道, ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显 示可执行模块的dependency。








=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=