1、命令简介
nm:用于查看二进制文件中符号表信息的实用工具。列出对象文件中的符号。
2、命令语法
nm [-a|--debug-syms] [-g|--extern-only] [-B] [-C|--demangle[=style]] [-D|--dynamic] [-S|--print-size] [-s|--print-armap] [-A|-o|--print-file-name][--special-syms] [-n|-v|--numeric-sort] [-p|--no-sort] [-r|--reverse-sort] [--size-sort] [-u|--undefined-only] [-t radix|--radix=radix] [-P|--portability] [--target=bfdname] [-fformat|--format=format] [--defined-only] [-l|--line-numbers] [--no-demangle] [-V|--version] [-X 32_64] [--help] [objfile...]
3、命令描述
它通常用于查看可执行文件、共享库(动态链接库)以及目标文件中的符号信息。这些符号可以是函数、变量、或其他程序实体,
nm 命令可以列出它们的地址、类型等信息。
GNU nm 列出了来自目标文件 objfile 的符号.... 如果没有列出任何目标文件作为参数,nm 假定文件为 a.out
。
对于每个符号,nm 显示:
标签 | 描述 | |
o | 符号值,采用选项选择的基数(见下文), 默认为十六进制。 | |
o | 符号类型。至少使用以下类型:其他的也一样, 取决于目标文件格式。如果是小写, 符号是本地的;如果是大写,符号是全局的(外部的)。 | |
A | 符号的值是绝对的,不会被后续的链接更改。 | |
B | 符号位于未初始化数据段(称为BSS)。 | |
C | 符号是常用的。常用符号是未初始化数据。在链接时, 多个具有相同名称的常用符号可能会出现。 如果符号在任何地方定义,则将常见符号视为未定义引用。 | |
D | 符号位于已初始化的数据段。 | |
G | 符号位于用于小型对象的已初始化数据段。 一些目标文件格式允许更有效地访问小数据对象, 例如全局 int 变量与大型全局数组相对。 | |
I | 符号是对另一个符号的间接引用。 这是对a.out目标文件格式的GNU扩展,很少使用。 | |
N | 符号是调试符号。 | |
R | 符号位于只读数据段。 | |
S | 符号位于用于小型对象的未初始化数据段。 | |
T | 符号位于文本(代码)段。 | |
U | 符号未定义。 | |
V | 符号是一个弱对象。 当弱定义的符号与普通定义的符号链接时, 将使用普通定义的符号,而不会出错。 当链接弱未定义的符号并且未定义符号时, 弱符号的值变为零,不会出错。 | |
W | 符号是一个未被明确标记为弱对象符号的弱符号。 当弱定义的符号与普通定义的符号链接时, 将使用普通定义的符号,而不会出错。 当链接弱未定义的符号并且未定义符号时, 符号的值以系统特定的方式确定,不会出错。 在某些系统上,大写表示已指定默认值。 | |
- | 符号是a.out目标文件中的stabs符号。 在这种情况下,打印的下一个值是stabs的其他字段, stabs的描述字段和stabs的类型。 stabs符号用于保存调试信息。 | |
? | 符号类型未知,或者是特定于目标文件格式的。 | |
o | 符号名称。 |
4、命令选项
选项 | 描述 |
--print-file-name | 在每个符号前加上它所在的输入文件(或归档成员)的名称, 而不是在所有符号之前只标识输入文件一次。 |
--debug-syms | 显示所有符号,包括仅供调试器使用的符号; 通常这些符号不会列出。 |
-B | 与 --format=bsd 相同(用于与MIPS nm的兼容性)。 |
--demangle[=style] | 将低级符号名称解码(解构)为用户级别名称。 除了去除系统添加的初始下划线之外, 这将使C++函数名称可读。 不同的编译器具有不同的名称编码风格。 可选的解码风格参数可用于选择适合您编译器的适当解码风格。 |
--no-demangle | 不要解码低级别符号名称。 这是默认值。 |
--dynamic | 显示动态符号而不是常规符号。 这仅对动态对象(例如某些类型的共享库)有意义。 |
-f format | 使用输出格式 format,可以是 bsd、sysv 或 posix。 默认为 bsd。format 的第一个字符是唯一重要的; 它可以是大写或小写。 |
--extern-only | 仅显示外部符号。 |
--line-numbers | 对于每个符号,使用调试信息尝试查找文件名和行号。 对于已定义的符号,查找符号地址的行号。 对于未定义的符号,查找引用该符号的重定位条目的行号。 如果可以找到行号信息,则在其他符号信息之后打印它。 |
--numeric-sort | 按地址的数值对符号进行数字排序, 而不是按名称进行字母排序。 |
--no-sort | 不要费心对符号进行任何排序; 按遇到的顺序打印它们。 |
--portability | 使用 POSIX.2 标准输出格式, 而不是默认格式。等效于 -f posix。 |
--print-size | 打印已定义符号的大小而不是值, 用于 bsd 输出格式。 |
--print-armap | 在从归档成员列出符号时, 包括索引:一个映射(由 ar 或 ranlib 存储在归档中) 指示哪些模块包含哪些名称的定义。 |
--reverse-sort | 颠倒排序的顺序(无论是数字还是字母); 让最后一个先出现。 |
--size-sort | 按大小对符号进行排序。 大小是作为符号值和下一个较高值符号值之间的差值计算的。 如果使用 bsd 输出格式,则打印符号的大小而不是值, 必须同时使用 -S 才能打印大小和值。 |
--special-syms | 显示具有特定于目标的特殊含义的符号。 这些符号通常由目标用于一些特殊处理, 通常在包含在正常符号列表中时不会有所帮助。 例如,对于ARM目标, 此选项将跳过用于标记ARM代码、THUMB代码 和数据之间转换的映射符号。 |
-t radix | 用 radix 作为打印符号值的基数。 必须为 d(十进制)、o(八进制)或 x(十六进制)。 |
--target=bfdname | 指定除系统默认格式以外的对象代码格式。 |
--undefined-only | 仅显示未定义符号(每个目标文件外部的符号)。 |
--defined-only | 仅为每个目标文件显示已定义符号。 |
--version | 显示 nm 的版本号并退出。 |
-X | 此选项被忽略,以与AIX版本的 nm 兼容。 它接受一个参数,必须是字符串32_64。 AIX nm 的默认模式对应于 -X 32,不受 GNU nm 支持。 |
--help | 显示 nm 选项的摘要并退出。 |
@file | 从文件中读取命令行选项。 读取的选项将替换原始的 @file 选项。 如果文件不存在或无法读取, 则该选项将被视为文字,不会被删除。 文件中的选项由空格分隔。 可以通过将整个选项括在单引号 或双引号中来包含选项中的空格字符。 任何字符(包括反斜杠)都可以通过在要包含的字符 前加上反斜杠来包含。 文件本身可能包含其他的 @file 选项; 所有这些选项将递归处理。 |
5、使用示例
1)显示引用符号的对象文件
$ nm -A ./*.o | grep func
2)显示可执行文件中的所有未定义符号
$ nm -u 1
3)显示可执行文件中的所有符号
$ nm -n namepid
4)搜索符号并显示其大小
$ nm -S 1 | grep abc
5)显示可执行文件中的动态符号
$ nm -D 1
6)更改 nm 输出的格式
$ nm -u -f posix 1
7)仅显示可执行文件的外部符号
$ nm -g 1
8)按符号大小对 nm 输出进行排序
$ nm -g --size-sort 1