linux ar命令参数及用法详解--linux建立、修改或抽取备存文件

来源:互联网 发布:php mysql配置 编辑:程序博客网 时间:2024/06/10 01:01


最近要看静态链接库文件(.a文件)里的内容,用到ar命令和nm命令,转一下。

ar命令

功能说明:建立或修改备存文件,或是从备存文件中抽取文件。


语  法:ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]

补充说明:ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

参  数:
 指令参数 
 -d  删除备存文件中的成员文件。 
 -m  变更成员文件在备存文件中的次序。 
 -p  显示备存文件中的成员文件内容。 
 -q  将问家附加在备存文件末端。 
 -r  将文件插入备存文件中。 
 -t  显示备存文件中所包含的文件。 
 -x  自备存文件中取出成员文件。 
 选项参数 
 a<成员文件>  将文件插入备存文件中指定的成员文件之后。 
 b<成员文件>  将文件插入备存文件中指定的成员文件之前。 
 c  建立备存文件。 
 f  为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入备存文件中过长的成员文件名称。 
 i<成员文件>  将问家插入备存文件中指定的成员文件之前。 
 o  保留备存文件中文件的日期。 
 s  若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表。 
 S  不产生符号表。 
 u  只将日期较新文件插入备存文件中。 
 v  程序执行时显示详细的信息。 
 V  显示版本信息。

范例1: 打包文件

[root@linuxso.com ~]# ls   //显示当前目录文件  
a.c b.c d.c   install.log   qte
anaconda-ks.cfg c.c Desktop 

[root@linuxso.com ~]# ar rv one.bak a.c b.c //打包 a.c b.c文件
ar: 正在创建 one.bak
a - a.c
a - b.c
[root@linuxso.com ~]#

范例2: 打包多个文件

[root@linuxso.com ~]# ar rv two.bak *.c  //打包以.c结尾的文件 
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c
[root@linuxso.com ~]#


范例3:显示打包文件的内容

[root@linuxso.com ~]# ar t two.bak   
a.c
b.c
c.c
d.c
[root@linuxso.com ~]#


范例4:删除打包文件的成员文件

[root@linuxso.com ~]# ar d two.bak a.c b.c c.c 
[root@linuxso.com ~]# ar t two.bak      
d.c
[root@linuxso.com ~]# 

使用示例:
1、构造可重用的库文件,并显示构造每个成员的文件详细过程。有文件a1,a2放到库lib中
 
ar -rv lib  a1,a2
 
2、检查示lib上的成员文件,并添加一个新的文件。
root@linuxso.com:~# ar -tv lib
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a1
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a2
 
添加一个新文件:
root@linuxso.com:~# ar -tv lib
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a1
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a2
root@linuxso.com:~# ar -qv lib 小哨兵还原卡 
a - 小哨兵还原卡
root@linuxso.com:~# ar -tv lib
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a1
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a2
rw-r--r-- 1000/1000    880 Dec 31 17:19 2010 小哨兵还原卡
 
3、在lib库中的小哨兵还原卡前面插入文件
root@linuxso.com:~# ar -vbr 小哨兵还原卡  lib network 
a - network
root@linuxso.com:~# ar -tv lib
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a1
rw-r--r-- 1000/1000      0 Jan  2 18:01 2011 a2
rw-r--r-- 1000/1000   3489 Dec 31 22:39 2010 network
rw-r--r-- 1000/1000    880 Dec 31 17:19 2010 小哨兵还原卡
 
注:
(1)不能添加目录文件
(2)添加的文件必须是普通文件
(3)在使用-a,-b,-i时,必须在命令行指明一个在库中已经存在的成员

nm命令
该命令列出可执行文件、动态链接库,等二进制文件中的符号表;
nm命令还是比较简单而且强大的。它用来列出一个目标文件中的各种符号。符号的种类很多,以下是一些常见的符号类型
nm输出字符含义RRead only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbolN这是一个调试符号D这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号TText段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号U未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型S未初始化的符号,比如全局变量int s;则s的符号就是此类型
nm命令的详细用法以及例子见正文。

先来例子,以下是a.c的内容:

#include <stdio.h>

static int s_global;
int i = 1;
char *str = "hello, world";
const ID = 10;
extern int e_global;
void function()
{
        printf("Hello");
}
int get_x()
{
        int x;
        x = 33;
        return x;
}

在执行"gcc -g -O -c a.c"产生a.o之后,用"nm -A a.o"的输出为:

a.o:00000000 R ID
a.o:00000000 T function
a.o:00000014 T get_x
a.o:00000000 D i
a.o:         U printf
a.o:00000000 b s_global
a.o:00000004 D str

nm的用法

nm的用法很简单,以下几个关键字比较常用:

1、"-A",列出符号名的时候同时显示来自于哪个文件。

这在同时列出多个文件(比如一个链接库)的符号时比较有用

2、"-a",列出所有符号

这将会把调试符号也列出来。默认状态下调试符号不会被列出。

3、"-l",列出符号在源代码中对应的行号

指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空

4、"-n",根据符号的地址来排序

默认是按符号名称的字母顺序排序的

5、"-u",只列出未定义符号

同"--undefined-only", 而"--defined-only"将只列出已定义符号