ar 命令详解
今天,跟着我们的技术大牛学了不少东西,首先就是这个ar命令啦。
当我们的程序中有经常使用的模块,而且这些模块在其他程序中也会用到,为了实现代码重用减少软件开发周期,我们可以将它们生成库,在需要的时候直接调用就可以了。这里介绍命令的ar,就是用来对库操作。在实际的项目中ar命令一般是写在makefile中,或者shell脚本中。
ar 命令
可以用来创建、修改和提取库(档案archives)
命令格式
ar [--plugin name] [-X32_64] [-]p[mod [relpos] [count]] archive [member...]
简述
库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
p关键字指定执行的操作(必须指定其中之一)
[ mod ] 修饰符可能会跟在p关键字的后面,用来指定操作的行为变化
a |
在库的一个已经存在的模块后面增加一个新的文件。如果使用修饰符a,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
b |
在库的一个已经存在的模块前面增加一个新的文件。如果使用修饰符b,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
c |
创建一个库。不管库是否存在,都将创建。 |
D |
在确定性的模式中起作用? |
f |
在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。 |
i |
在库的一个已经存在的模块前面增加新的文件。如果使用修饰符i,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
l |
暂未使用 |
N |
与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。 |
o |
当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。 |
P |
进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。这个选项将导致GNU ar匹配文件名使用完整的路径名,可以使用其他工具方便的从存档中提取一个文件。 |
s |
写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。 |
S |
不创建目标文件索引,这在创建较大的库时能加快时间 |
T |
|
u |
一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项 |
v |
这个修饰符显示一个操作的详细、额外的信息 |
V |
显示ar的版本 |
ar忽略了最开始的选项-X32_64,是为了和AIX兼容。
实例:
libmd5.a: md5.o md4.o
@echo Building "libmd5.a..."
ar rv libmd5.a md5.o md4.0
生成了一个库,库名字是md5,链接时可以用-lmd5链接。该库中存放了两个模块md5.o和md4.o。选项前可以有'-'字符,也可以没有。
既然库已经建好了,那么如何查看库包含的模块(函数)呢??
那就使用nm 命令吧!
nm 命令详解
列出目标文件的标识(我们主要用来看库函数,可以结合grep)
命令格式
nm [option(s)] [file(s)]
有用的options:
-
-A 在每个符号信息的前面打印所在对象文件名称;
-
-C 输出demangle过了的符号名称;
-
-D 打印动态符号;
-
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-
-n 按照地址/符号值来排序;
-
-u 打印出那些未定义的符号;
常见的符号类型:
-
A 该符号的值在今后的链接中将不再改变;
-
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
-
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
-
T 该符号放在代码段中,通常是那些全局非静态函数;
-
U 该符号未定义过,需要自其他对象文件中链接进来;
-
W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。
注意几点:
-
-C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
-
使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc。
-
使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。
这几天项目一直赶得紧,可能更新的不及时,不过还是要坚持,向我的技术老大致敬!