linux的nm命令详解
-
nm命令是Linux系统中的一个常用命令,用于查看目标文件或者可执行文件中的符号表。下面详细介绍一下nm命令的使用方法和功能。
一、nm命令的语法和参数
nm命令的基本语法为:
nm [选项] [目标文件]
常用的选项包括:
1. -A:显示所有符号。
2. -C:将符号的名称按照编译器的规则进行 demangle(去花式)。
3. -D:显示动态符号。
4. -g:显示全局符号。
5. -n:按照地址的大小顺序进行排序。
6. -p:用十六进制的形式显示地址。
7. -u:仅显示未定义符号。
8. -U:仅显示已定义符号。
9. –version:显示nm命令的版本信息。
10. –help:显示nm命令的帮助信息。二、nm命令的功能和应用场景
nm命令主要用于查看目标文件或者可执行文件中的符号表。符号表记录了目标文件中定义和引用的全局符号的信息,包括函数、变量、常量等。通过使用nm命令,我们可以了解到目标文件中的符号信息,包括符号的名称、地址、类型等。
nm命令的应用场景主要有以下几个方面:
1. 查看目标文件中的导出函数和全局变量:通过使用nm命令可以查看到目标文件中导出的函数和全局变量的名称和地址,帮助我们了解目标文件的结构和功能。
2. 查找函数和变量的定义和引用:通过查看目标文件中的符号表,我们可以了解函数和变量的定义和引用关系,帮助我们在程序调试和代码分析时定位问题。
3. 检查库文件的版本和依赖关系:通过使用nm命令可以查看库文件中的符号信息,从而了解库文件的版本和依赖关系,帮助我们解决动态链接库的依赖问题。
4. 与其他工具的结合使用:nm命令可以与其他工具结合使用,如objdump、readelf等,帮助我们更详细地了解目标文件的结构和信息。三、nm命令的示例
1. 查看可执行文件中的符号表:
nm -C /path/to/executable
2. 查看库文件中的符号表:
nm -C /path/to/library
3. 查找库文件中某个函数的定义和引用:
nm -C /path/to/library | grep function_name
4. 查找可执行文件中未定义的符号:
nm -u /path/to/executable
5. 按照地址的大小顺序进行排序:
nm -n /path/to/file
以上是对nm命令的详细介绍,希望能帮助你更好地使用该命令。通过使用nm命令,我们可以查看目标文件中的符号表,了解符号的名称、地址和类型等信息,从而帮助我们进行程序调试和代码分析。
2年前 -
Linux的nm命令是用于显示目标文件(可执行文件、库文件等)中的符号表信息的命令。它可以用来查看目标文件中的函数、变量以及其他符号的地址、类型以及可见性等信息。下面是对Linux的nm命令的详细解释和使用方法:
1. 基本语法:
nm [选项] [文件]
选项说明:
-A:以十六进制和ASCII码形式显示符号的值
-a:按照地址顺序进行排序显示符号表
-C:进行符号修饰,显示完整的符号信息
-g:只显示外部全局符号
-u:只显示未定义的符号
-V:显示nm命令的版本信息
-h:显示帮助信息2. 显示符号地址和类型:
nm命令通过查看文件中的符号表来显示符号的地址和类型。当文件中有多个目标文件时,nm命令会按照按字母顺序显示符号表。可以通过 -a 选项来按照地址排序显示符号表。而 -C 选项则可以显示符号的完整信息,包括符号的修饰符(如C++中的类名和命名空间)。
例如,运行命令 “nm -C example.o” 可以显示 example.o 文件的符号表。
3. 显示符号的可见性和绑定:
nm命令可以通过符号的可见性和绑定信息来显示符号的访问权限。可见性指示符号是否在当前文件中可见,而绑定指示符号的连接类型,如局部连接或者全局连接。
可见性:
– “T”表示可见的局部符号
– “W”表示弱连接符号
– “U”表示未定义的符号
– “V”表示可见的全局符号绑定:
– “w”表示弱连接符号
– “g”表示全局连接符号
– “l”表示局部连接符号
– “u”表示未定义符号4. 显示库文件的依赖关系:
nm命令还可以显示库文件的依赖关系。运行命令 “nm -D example.so” 可以显示 example.so 文件的所有依赖的库文件。
通过查看文件中的动态符号表,nm命令可以找到库文件依赖的其他库文件。这对于解决库文件缺失或版本不兼容的问题非常有用。
5. 其他选项和使用场景:
– -G:只显示外部全局符号,不包括本地全局符号。
– -u:只显示未定义的符号。
– -p:显示原始的符号表信息,不进行任何解析。
– -r:反向排序显示符号表。
– -S:显示符号的大小。nm命令在调试和分析程序时非常有用。可以通过查看符号表来了解函数和变量的定义和使用情况,以及库文件的依赖关系。 nm命令还可以与其他命令,如grep和awk等结合使用,进行更多高级的符号分析工作。
这些是对Linux的nm命令的详细解释和使用方法。通过使用这些选项和参数,可以充分利用nm命令来分析和理解目标文件中的符号信息。
2年前 -
nm命令是Linux操作系统中的一个工具,它用于显示可执行文件中的符号表信息。符号表包含了函数、变量、符号等的相关信息,在编译过程中由编译器自动生成并嵌入到可执行文件中。使用nm命令可以查看这些符号的名称、类型和地址等信息,对于分析可执行文件非常有用。
下面是对nm命令的详解,包括使用方法、操作流程等方面的说明。
## 1. nm命令的基本语法
nm命令的基本语法如下:
“`
nm [选项] 可执行文件
“`可执行文件指定要查看符号表的文件,可以是二进制文件、静态库或动态库。
常用的选项有:
– -a或–debug-syms:显示所有符号表,包括调试符号表。
– -C或–demangle:对C++的函数名进行反编译,显示更友好的函数名。
– -f或–dynamic:显示动态库的符号表信息。
– -o或–digits:在输出中显示符号的地址。
– -r或–reverse-sort:按字母逆序排序。
– -t或–defined-only:只显示已定义的符号。
– -u或–undefined-only:只显示未定义的符号。## 2. 使用nm命令查看可执行文件的符号表
使用nm命令查看可执行文件的符号表很简单,只需要在命令行中输入nm加上可执行文件的路径即可。命令的输出结果包含了符号的地址、类型和名称。
例如,查看一个名为`example`的可执行文件的符号表:
“`
nm example
“`输出结果类似于以下内容:
“`
0000000000601028 D __data_start
0000000000601028 W data_start
0000000000601030 D __dso_handle
0000000000400440 t deregister_tm_clones
…
“`输出的每一行代表一个符号,包含了四个字段:符号的地址、类型、绑定和名称。
– 地址(Address)字段显示符号的地址,以十六进制形式表示。
– 类型(Type)字段显示符号的类型,常见的类型有:
– T:表示符号是一个代码符号(函数)。
– D:表示符号是一个数据符号(变量)。
– U:表示符号未定义。
– 绑定(Binding)字段显示符号的绑定类型,常见的绑定类型有:
– W:表示弱绑定。
– G:表示全局绑定。
– 名称(Name)字段显示符号的名称。## 3. 使用nm命令查看静态库的符号表
nm命令也可以用来查看静态库文件的符号表信息。对于静态库文件,可以使用与查看可执行文件相同的命令来查看其符号表。
例如,查看名为`libexample.a`的静态库文件的符号表:
“`
nm libexample.a
“`输出结果与查看可执行文件的符号表类似。
## 4. 使用nm命令查看动态库的符号表
通过添加`-f`或`–dynamic`选项,可以使用nm命令查看动态库文件的符号表信息。动态库文件是共享库文件,它在运行时才会被加载到内存中。
例如,查看一个名为`libexample.so`的动态库文件的符号表:
“`
nm -f libexample.so
“`输出结果与查看可执行文件的符号表类似。
## 5. nm命令的高级用法
nm命令还有一些高级用法可以更加灵活地使用。下面介绍一些常见的用法:
### 5.1 反编译C++函数名
对于C++编写的程序,函数名经过编译过程后会进行名称重整和符号修饰,导致显示的函数名不够友好。使用`-C`或`–demangle`选项可以对函数名进行反编译,显示更加友好的函数名。
例如,查看一个名为`example`的可执行文件中的符号表,并对C++函数名进行反编译:
“`
nm -C example
“`### 5.2 只显示已定义的符号
使用`-t`或`–defined-only`选项可以只显示已定义的符号,忽略未定义的符号。这对于分析可执行文件的符号表非常有用。
例如,查看一个名为`example`的可执行文件中只显示已定义的符号:
“`
nm -t example
“`### 5.3 只显示未定义的符号
使用`-u`或`–undefined-only`选项可以只显示未定义的符号,忽略已定义的符号。这对于分析可执行文件的依赖关系非常有用。
例如,查看一个名为`example`的可执行文件中只显示未定义的符号:
“`
nm -u example
“`## 总结
nm命令是Linux操作系统中一个非常有用的工具,可以用于查看可执行文件、静态库和动态库的符号表信息。通过使用各种选项,可以对符号进行排序、过滤和格式化输出,方便进行符号分析、依赖关系分析和优化等工作。熟练掌握nm命令的使用方法,可以帮助我们更好地理解可执行文件的结构和内部实现。
2年前