`
jubincn
  • 浏览: 242561 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

linux 的库操作命令 ar和nm

 
阅读更多

转自:http://www.blogjava.net/jinfeng_wang/archive/2009/06/08/280748.html

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}]ArchiveFile[File...]

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}]ArchiveFileFile...

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)中一个文件的名称,此名称紧跟在标志列表后,并由空格隔开。

-aPositionName PositionName参数标识的现有文件后安置指定的文件。
-bPositionName PositionName参数标识的现有文件前安置指定的文件。
-c 禁止在创建时产生的正常消息。
-C 阻止解压缩的文件替换文件系统中同名的文件。
-d 从库中删除指定的文件。
-g 对压缩文档成员进行排序以确保用最小数量的未用空间获得最大的加载效率。在几乎所有情况下,-g标志以压缩文档成员的逻辑链接顺序物理地安置它们。最终生成的压缩文档通常写成小格式,这样该标志可用来将大格式压缩文档转换成小格式压缩文档。包含 64 位XCOFF对象的压缩文档不能创建成或转换至小格式。
-h 将指定的文件的成员报头中的修改时间设置为当前日期和时间。如果不指定任何文件名称,那么ar命令设置所有成员报头的时间戳记。此标志不能和-z标志一起使用。
-iPositionName 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标志复制库中的所有文件。此过程不会更改库。
-Xmode 指定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.ostrcpy.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.ostrcat.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.ostrcpy.o移动到紧跟在strcmp.o成员之后的位置。保留strcat.ostrcpy.o成员的相对顺序。换句话说,如果在移动之前strcpy.o成员在strcat.o成员之前,那么(移动后)它依旧如此。

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

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

    此命令将成员strcat.ostrcpy.o分别复制到名为strcat.ostrcpy.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.oshrsub3.o...

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

    cc -omainmain.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.

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

    关于Linux静态库和动态库的分析

    在Linux操作系统中,库扮演着至关重要的角色,它们是代码复用和模块化编程的核心。库分为静态库(.a)和动态库(.so),这两种库各有优缺点。静态库在编译时会被完整地集成到可执行文件中,因此生成的可执行文件体积...

    linux for beginner解读Linux编程库

    Linux还提供了几个重要的库管理命令,如`ldd`用于查看可执行文件依赖的共享库,`ar`用于管理静态库,`ld`用于链接器操作,`nm`用来查看库中的符号信息,`strip`用于去除库文件中的调试信息以减小文件大小。...

    Linux下编译静态库和动态库1

    Linux 下编译静态库和动态库 Linux 下编译静态库和动态库是 Linux 开发中非常重要的一部分。静态库和动态库都是库文件,但是它们的使用方式和特点不同。下面我们将详细介绍 Linux 下编译静态库和动态库的过程。 一...

    Linux使用和生成库.docLinux使用和生成库.doc

    3. 使用`gcc testlib.o -lhello -o testlib`命令连接目标文件和库,生成可执行文件`testlib`。这里,`-lhello`表示链接`libhello`库。 4. 如果需要与静态库`libhello.a`连接,命令变为`gcc testlib.o -o testlib -WI...

    Linux静态动态链接库的创建和使用

    ### Linux静态动态链接库的创建和使用 #### 概述 在Linux环境下,链接库是程序开发中的一个重要组成部分。它们可以被多个程序共享,并且能够有效地管理代码复用。链接库分为静态链接库和动态链接库两种类型。本文...

    Linux静态and动态链接库 创建和使用

    ### Linux静态和动态链接库创建和使用 #### 概述 在软件开发过程中,经常会遇到相同功能模块在多个项目中重复出现的情况。例如,多个项目可能都需要实现用户验证功能。为了避免代码重复,提高代码的可维护性和重用...

    linux程序设计(第三版)

    本书的首要目标是向CC++软件开发人员介绍LINUX和UNIX软件编程工具,因此第Ⅱ部分对此进行详细介绍,包括gcc、make、ar、gdb、gprof、nm、size、rcs和cvs等。在编写本书时,我们假设读者以前不了解LINUXUNIX及编程...

    linux 命令英文全称

    ### Linux命令英文全称解析 Linux作为一款强大的开源操作系统,其命令行工具是进行系统管理、软件开发等...Linux命令的强大之处在于它们的高度灵活性和组合能力,掌握这些命令的基本用法,可以极大地提高工作效率。

    linux-binutils

    Linux Binutils 是一组用于处理各种程序文件的工具集合,它包含了一系列用于开发和调试的实用程序,如 addr2line、ar、nm等。这些工具在Linux操作系统和类似环境中的软件开发过程中扮演着重要角色。 首先,`addr2...

    arm-linux-系列工具.pdf

    `arm-linux-elf-nm`则用于显示目标文件或库文件中的符号信息,这对于调试和分析程序非常有用。 总的来说,ARM-Linux系列工具构成了一个完整的软件开发工具链,它们协同工作,帮助开发者高效地构建、优化和调试ARM...

    arm-fsl-linux-gnueabi-交叉编译工具链

    6. **binutils**: 包含像ar(用于创建和管理库)、objdump(用于分析目标文件和可执行文件)、nm(列出目标文件或库的符号)等工具。 7. **头文件**: 提供函数原型、常量定义和其他接口声明,供源代码引用。 "arm-fsl-...

    Linux指令一周通 (技术图书大系).azw3

    7.10 ld指令:链接目标文件和库文件 7.11 make指令:编译内核或模块 7.12 nm指令:显示目标文件中的符号 7.13 startx指令:启动x-Windows图形界面 7.14 xhost指令:设置X服务器的访问权限 7.15 xinit指令:启动x-...

    Linux应用编程基础PPT课件.ppt

    Binutils是一组用于编译、链接、汇编和其他调试目的的程序,包括ar, as, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip等。Gcc是GNU的编译器集合,Linux环境使用的C语言编译器。Glibc是GNU的...

    linux环境编程(自己面试总结的)

    nm和ldd是用于查看二进制文件信息的工具。 - nm工具用于列出指定文件中的符号。其主要作用包括: - 判断程序是否定义了指定的符号。 - 查看符号地址和在进程空间的位置。 - ldd工具用于列出程序依赖的动态库。其...

    C++静态库的依赖demo

    - 使用`ar`工具:在Unix/Linux系统中,通常使用`ar`命令创建静态库。例如,我们有多个`.o`对象文件,如`foo.o`, `bar.o`,可以使用`ar rcs libmylib.a foo.o bar.o`来创建名为`libmylib.a`的静态库。 - 使用Visual...

    Linux相关系列7中gcc的全部rpm包

    4. **binutils**: 包含了诸如ld(链接器)、as(汇编器)、ar(存档工具)和nm(符号查看器)等一系列二进制工具,它们在编译过程中扮演重要角色。 5. **cpp**: C预处理器,处理C语言的宏定义、条件编译等预处理...

    Linux上的C-C++编译器和调试器

    - **ar**: 用于创建和管理静态库。 - **objdump**: 用于反汇编目标文件或可执行文件,查看汇编代码。 - **nm**: 显示符号列表。 - **size**: 显示目标文件或可执行文件的大小信息。 - **strings**: 显示目标文件或可...

    xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin.7z

    4. **Binutils**:包括as(汇编器)、ar(归档文件管理器)、nm(符号表查看器)等工具,它们在构建过程中起着重要作用。 三、使用场景 1. **嵌入式Linux开发**:当开发者需要在Xilinx的Zynq、Kintex、Virtex等SoC...

Global site tag (gtag.js) - Google Analytics