Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux nm 命令。

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

推荐文档