nm

列出目标文件中的标识符


语法格式

nm [-aADglnopPrsSuv] [-C|--demangle[=style]] [--defined-only] [-f fmt]
[--no-demangle] [--size-sort] [-t radix] [--target=bfdname]
@file [objfiles]
nm [--help] [-V|--version]

命令简介

nm命令用于显示指定目标文件中的标识符。其中,objfiles是一个或一组目标文件。如果未指定目标文件,nm假定目标文件是a.out。

对于每一个标识符,nm将会以十六进制数值(除非“-t”选项另有指定)显示标识符的值、标识符的类型和标识符的名字。常见的标识符类型如下(其中,小写的类型表示局部标识符,大写的类型表示全局或外部标识符。根据目标文件格式,也许还存在其他类型):

A  标识符的值是绝对值,即使在连接时也不能改变。

B, b  标识符位于未初始化的数据段(即BSS)。

C  通用标识符(通用标识符是未初始化的数据)。

D, d  标识符位于已初始化的数据段。

G, g  标识符是位于已初始化数据段的小数据对象。

i  对于ELF格式的目标文件而言,标识符是一个间接函数。

N  标识符是一个调试符号。

p  标识符位于栈的展开段。

R, r  标识符位于只读的数据段。

S, s  标识符位于小型目标文件的未初始化数据段。

T, t  标识符位于代码段。

U  未定义的标识符。

u  标识符是一个唯一的全局标识符。

V, v  标识符是一个弱对象。

W, w  标识符是一个没有特别标记为弱对象的弱标识符。

-  a.out目标文件中的stab标识符(stab标识符主要用于存储调试信息)。

?  未知的标识符类型,也许是目标文件格式特定的标识符。

命令选项

-a, --debug-syms  显示所有的标识符,包括仅用于调试的标识符(这一部分通常不显示)。

-A, -o, --print-file-name  在每个标识符前面插入输入文件(或档案文件中的成员模块)的名字,而不是按常规的做法,仅仅在所有标识符之前显示一次输入文件。

-C, --demangle[=style]  把低级的标识符名译成用户级的标识符名,删除系统增加的下画线首字符,使得C++的函数名更容易辨认与理解。

-D, --dynamic  显示动态标识符而非普通标识符。这个选项仅适用于动态目标文件,如某些类型的共享库函数。

-f fmt, --format=fmt  按照指定的格式显示标识符,nm支持的格式是bsd(默认)、sysv和posix。在指定显示格式时,实际上只需给出第一个字符,而且大小写均可。

-g, --extern-only  仅显示外部标识符。

-l, --line-numbers  对于每一个标识符,使用调试信息尝试找出其文件名及行号。对于已定义的标识符,寻找标识符地址的行号;对于未定义的标识符,寻找引用标识符的重定位入口的行号。如果能够找到行号信息,在其他标识符信息之后显示行号。

-n, -v, --numeric-sort  按照其地址的数字顺序而非其名字的字符顺序对标识符进行排序。

-p, --no-sort  以遇到的顺序显示标识符,而不是采用其他任何顺序对标识符进行排序。

-P, --portability  使用POSIX.2标准(而非默认)的输出格式。相当于指定了“-f posix”选项。

-r, --reverse-sort  逆向排序(不管是数字还是字符)。

-s, --print-armap  当显示的标识符位于档案文件的成员模块时,显示其标识符索引表(由ar或ranlib创建并存储在档案文件中),从而显示一个成员模块中包含的标识符定义。

-S, --print-size  在bsd风格的输出数据中,显示标识符的值及标识符数据类型的大小。对于不记录标识符数据类型大小的目标文件而言,这个选项不起任何作用,除非也指定了“--size-sort”选项,此时nm会显示计算出来的标识符数据类型的大小。

-t radix, --radix=radix  使用指定的基数显示标识符的值。其中radix可以是d(表示十进制数值)、o(表示八进制数值)或x(表示十六进制数值)。

-u, --undefined-only  仅显示未定义的标识符(目标文件中引用的外部符号)。

--defined-only  仅显示目标文件定义的标识符。

--no-demangle  禁止翻译低级的标识符名(默认的做法)。

--size-sort  按照标识符数据类型的大小排序。如果采用bsd风格输出数据,显示标识符数据类型的大小,否则显示标识符的值。如果二者都需要显示,必须使用“-S”选项。

--target=bfdname  指定目标代码的格式(而非系统的默认格式)。

@file  从指定的文件中读取命令行选项。把读取的选项插入@file的位置,取而代之。选项的写法如同命令行,多个选项之间需加空格分隔符。文件中也可以包括@file选项,采用同样的方法递归处理。

应用实例

1. 显示所有的标识符,包括调试标识符。

$ nm -a mf

2. 显示未定义的标识符,即目标文件中引用的外部符号。

$ nm -u mf

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z