linux 的库操作命令 ar和nm

linux 的库操作命令 ar和nm
http://dev.csdn.net/article/69/69405.shtm
http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds1/ar.htm
 

当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm,用来对库操作。

1.ar基本用法
2.nm基本用法命令

 当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm,用来对库操作。

1.ar基本用法

  ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

  下面是ar命令的格式:

ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

  例如我们可以用ar rv libtest.a hello.o hello1.o来生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。

  {dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下:

  • d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。
  • m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。
  • p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。
  • q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。
  • r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  • t:显示库的模块表清单。一般只显示模块名。
  • x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。

  下面在看看可与操作选项结合使用的任选项:

  • a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。
  • b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。
  • c:创建一个库。不管库是否存在,都将创建。
  • f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。
  • i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。
  • l:暂未使用
  • N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。
  • o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。
  • P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。
  • s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。
  • S:不创建目标文件索引,这在创建较大的库时能加快时间。
  • u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项。
  • v:该选项用来显示执行操作选项的附加信息。
  • V:显示ar的版本。

2.nm基本用法命令

  nm用来列出目标文件的符号清单。下面是nm命令的格式:

nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap][-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort][-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix][-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]

  如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持"-"开头的短格式和"—"开头的长格式。

  • -A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。

    例如nm libtest.a的输出如下:

    CPThread.o:
    00000068 T Main__8CPThreadPv
    00000038 T Start__8CPThread
    00000014 T _._8CPThread
    00000000 T __8CPThread
    00000000 ? __FRAME_BEGIN__
    .......................................

    则nm -A 的输出如下:

    libtest.a:CPThread.o:00000068 T Main__8CPThreadPv
    libtest.a:CPThread.o:00000038 T Start__8CPThread
    libtest.a:CPThread.o:00000014 T _._8CPThread
    libtest.a:CPThread.o:00000000 T __8CPThread
    libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__
    ..................................................................
  • -a或--debug-syms:显示调试符号。
  • -B:等同于--format=bsd,用来兼容MIPS的nm。
  • -C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
  • -D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
  • -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
  • -g或--extern-only:仅显示外部符号。
  • -n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
  • -p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。
  • -P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
  • -s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
  • -r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。
  • --size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
  • -t radix或--radix=radix:使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。
  • --target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
  • -u或--undefined-only:仅显示没有定义的符号(那些外部符号)。
  • -l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
  • -V或--version:显示nm的版本号。
  • --help:显示nm的任选项。




 

ar 命令

用途

维护链接编辑器使用的索引库。

语法

ar-c ] [  -l ] [  -g | -o ] [  -s ] [  -v ] [  -C ] [  -T ] [  -z ] {  -h -p -t -x } [  -X  {32|64|32_64|d64| any}] ArchiveFileFile ... ]

ar-c ] [  -l ] [  -g | -o ] [  -s ] [  -v ] [  -C ] [  -T ] [  -z ] {  -m -r -u ] } [ {  -a -b -i }  PositionName  ] [  -X  {32|64|32_64|d64|any}]   ArchiveFile File ...

ar-c ] [  -l ] [  -g | -o ] [  -s ] [  -v ] [  -C ] [  -T ] [  -z ] {  -d -q } [  -X  {32|64|32_64|d64|any}] ArchiveFile File ...

ar-c ] [  -l ] [  -v ] [  -C ] [  -T ] [  -z ] {  -g | -o-s -w } [  -X  {32|64|32_64|d64|any}] ArchiveFile

描述

ar 命令维护链接编辑器使用的索引库。ar 命令将一个或多个指定的文件并入单个写成 ar 压缩文档格式的压缩文档文件。当 ar 命令创建库时,它创建可传输格式的报头;当它创建或更新库时,它重建符号表。有关格式和索引压缩文档和符号表的结构的信息,请参阅 ar 文件格式条目。

ar 命令识别两种文件格式。“大压缩文档格式”ar_big,是缺省文件格式并支持 32 位和 64 位目标文件。“小压缩文档格式”可用于创建在比 AIX 4.3 更老的版本上可识别的压缩文档,请参阅 -g 标志。如果将一个 64 位的对象添加到小格式压缩文档,除非指定了 -g,否则 ar 首先将它转换为大格式。缺省情况下,ar 仅处理 32 位目标文件;压缩文档中任何 64 位目标文件在没有提示的情况下被忽略。要更改此行为,请使用 -X 标志或设置 OBJECT_MODE 环境变量。

标志

ar 命令中,可以从集 cClosTv 中指定任何数量的可选标志。必须从标志集 dhmopqrstwx 中指定一个标志。如果选择 -m-r 标志,您可能还要指定一个位置标志(-a-b-i);对于 -a-b-i 标志,您必须还指定在 ArchiveFilePositionName)中一个文件的名称,此名称紧跟在标志列表后,并由空格隔开。

-a PositionName PositionName 参数标识的现有文件后安置指定的文件。
-b PositionName PositionName 参数标识的现有文件前安置指定的文件。
-c 禁止在创建时产生的正常消息。
-C 阻止解压缩的文件替换文件系统中同名的文件。
-d 从库中删除指定的文件。
-g 对压缩文档成员进行排序以确保用最小数量的未用空间获得最大的加载效率。在几乎所有情况下,-g 标志以压缩文档成员的逻辑链接顺序物理地安置它们。最终生成的压缩文档通常写成小格式,这样该标志可用来将大格式压缩文档转换成小格式压缩文档。包含 64 位 XCOFF 对象的压缩文档不能创建成或转换至小格式。
-h 将指定的文件的成员报头中的修改时间设置为当前日期和时间。如果不指定任何文件名称,那么 ar 命令设置所有成员报头的时间戳记。此标志不能和 -z 标志一起使用。
-i PositionName PositionName 参数标识的现有文件前安置指定的文件(和 -b 相同)。
-l 将临时文件置于当前(本地)目录中,而非 TMPDIR 目录中(缺省为 /tmp)。
-m 将指定的文件移动到库中的某个其他位置。缺省情况下,它将指定的文件移动到库的末尾。使用位置标志(abi)来指定某个其他位置。
-o 对压缩文档成员进行排序以确保用最小数量的未用空间获得最大的加载效率。在几乎所有情况下,-o 标志以压缩文档成员的逻辑链接顺序物理地安置它们。最终生成的压缩文档通常写成大格式,这样该标志可用来将小格式压缩文档转换成大格式压缩文档。
-p Files 参数中指定的文件的内容或在 ArchiveFile 参数中指定的所有文件(如果您不指定任何文件)都写至标准输出。
-q 将指定的文件添加到库的末尾。另外,如果指定同一个文件两次,它可能被放入库中两次。
-r 如果指定的文件已经存在于库中,那么替换它。因为指定的文件在库中占据它们替换的文件的同一个位置,位置标志没有任何附加的影响。当和 -u 标志(更新)一起使用时,-r 标志仅替换自从最后一次添加到库中以后修改的文件。

如果指定的文件不存在于库中,那么 ar 命令添加它。在这种情况下,位置标志影响放置。如果不指定位置,那么将新文件置于库的末尾。如果指定同一个文件两次,它可能被放入库中两次。

-s 无论 ar 命令是否修改了库内容都强制重新生成库符号表。请在库上使用 strip 命令之后,使用此标志来恢复库符号表。
-t 将库的目录写至标准输出。如果指定文件名称,那么仅显示指定的那些文件。如果不指定任何文件,-t 标志列出库中的所有文件。
-T 如果压缩文档成员名称比文件系统支持的长,那么允许文件名称截短。此选项无效,因为文件系统支持的名称长度等于 255 个字符的最大压缩文档成员名称。
-u 仅复制自它们最后一次复制起更改的文件(请参阅先前讨论过的 -r 标志)。
-v 将建立新库的详细的逐个文件的描述写至标准输出。当和 -t 标志一起使用时,它给出类似于 ls -l 命令给出的长列表。当和 -x 标志一起使用时,它在每个文件前加一个名称。当和 -h 标志一起使用,它列出成员名称和更新的修改时间。
-w 显示压缩文档符号表。每个符号和其中定义此符号的文件的名称一起列出。
-x 通过将指定的文件复制到当前目录来解压缩它们。这些副本和原始文件(保留在库中)具有相同的名称。如果不指定任何文件,-x 标志复制库中的所有文件。此过程不会更改库。
-X mode 指定 ar 应检查的目标文件的类型。mode 必须是下列其中一项:
32
仅处理 32 位目标文件
64
仅处理 64 位目标文件
32_64
处理 32 位 和 64 位目标文件
d64
检测已终止的 64 位 XCOFF 文件(幻数 == U803XTOCMAGIC)。
any
处理所有受支持的对象文件。
缺省值是处理 32 位目标文件(忽略 64 位对象)。mode 还可以用 OBJECT_MODE 环境变量来设置。例如,OBJECT_MODE=64 使 ar 处理任何 64 位对象并忽略 32 位对象。-X 标志覆盖 OBJECT_MODE 变量。
-z 创建压缩文档的临时副本并对副本执行所有要求的修改。当所有操作成功完成时,压缩文档的工作副本覆盖原始副本。此标志不能和 -h 标志一起使用。
ArchiveFile 指定压缩文档文件名称;必需。
MemberName ... 各压缩文档成员的名称。

退出状态

该命令返回以下退出值:

0 成功完成。
>0 发生错误。

示例

  1. 要创建一个库,请输入:

     

    ar -v -q lib.a strlen.o strcpy.o

    如果 lib.a 库不存在,那么此命令创建它,并将文件 strlen.o 和 strcpy.o 的副本输入其中。如果 lib.a 库存在,那么此命令在不检查相同成员的情况下,将新的成员添加到末尾。v 标志设置详细方式,在此方式中 ar 命令在其进行时显示进程报告。

  2. 要显示库的目录,请输入:

     

    ar -v -t lib.a

    此命令列出了 lib.a 库的目录,显示类似于 ls -l 命令的输出的长列表。要只列出成员文件名称,那么省略 -v 标志。

  3. 要替换或添加新成员到库中,请输入:

     

    ar -v -r lib.a strlen.o strcat.o

    此命令替换成员 strlen.o 和 strcat.o。如果 lib.a 如示例 1 中显示的那样创建,那么替换 strlen.o 成员。因为不存在名为 strcat.o 的成员,所以它被添加到库的末尾。

  4. 要指定在何处插入新成员,请输入:

     

    ar -v -r -b strlen.o lib.a strcmp.o

    此命令添加 strcmp.o 文件,并将该新成员置于 strlen.o 成员之前。

  5. 要更新一个已经更改过的成员,请输入:

     

    ar -v -r -u lib.a strcpy.o

    此命令替换现有 strcpy.o 成员,但仅当文件 strcpy.o 自从最后一次添加到库后已经修改时才替换它。

  6. 要更改库成员的顺序,请输入:

     

    ar -v -m -a strcmp.o lib.a strcat.o strcpy.o

    此命令将成员 strcat.o 和 strcpy.o 移动到紧跟在 strcmp.o 成员之后的位置。保留 strcat.o 和 strcpy.o 成员的相对顺序。换句话说,如果在移动之前 strcpy.o 成员在 strcat.o 成员之前,那么(移动后)它依旧如此。

  7. 要解压缩库成员,请输入:

     

    ar -v -x lib.a strcat.o strcpy.o

    此命令将成员 strcat.o 和 strcpy.o 分别复制到名为 strcat.o 和 strcpy.o 的文件。

  8. 要解压缩并重命名一个成员,请输入:

     

    ar -p lib.a strcpy.o >stringcopy.o

    此命令将成员 strcpy.o 复制到一个名为 stringcopy.o 的文件。

  9. 要删除一个成员,请输入:

     

    ar -v -d lib.a strlen.o

    此命令从 lib.a 库中删除成员 strlen.o。

  10. 要从多个用 ld 命令创建的共享模块中创建一个压缩文档库,请输入:

     

    ar -r -v libshr.a shrsub.o shrsub2.o shrsub3.o ...

    此命令从名为 shrsub.o、shrsub2.o、shrsub3.o 等等的共享模块中创建名为 libshr.a 的压缩文档库。要编译并链接使用 libshr.a 压缩文档库的 main 程序,请使用以下命令:

    cc -o main main.c -L/u/sharedlib -lshr

    main 程序现在是可执行的。main 程序引用的任何符号(包含在libshr.a 压缩文档库中)已经因延迟分辨率而作了标记。-l 标志指定应在 libshr.a 库中搜索这些符号。

  11. 要列出 lib.a 的内容(忽略任何 32 位目标文件),请输入:

     

    ar -X64 -t -v lib.a
  12. 要从 lib.a 解压缩所有 32 位的目标文件,请输入:

     

    ar -X32 -x lib.a
  13. 要列出 lib.a 中的所有文件,无论是 32 位、64 位或非对象,请输入:

     

    ar -X32_64 -t -v lib.a

文件

 

/tmp/ar* 包含临时文件。

你可能感兴趣的:(linux 的库操作命令 ar和nm)