`

linux 的库操作命令 ar和nm

阅读更多

当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍两个命令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的任选项。

分享到:
评论

相关推荐

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

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics