nm (Unix) - 维基百科,自由的百科全书
開發者 | AT&T贝尔实验室 |
---|---|
首次发布 | 1971年11月3日 |
操作系统 | Unix和类Unix |
类型 | 命令 |
nm命令存在于多数后出版本的Unix及类似的操作系统中。nm被用来检查二进制文件(包括库,编译后的目标模块,共享目标文件,和独立可执行文件)并显示这些文件的内容,或存储在其中的元信息,特别是符号表。来自nm的输出区分各种符号类型。例如,在一个目标文件所提供的函数和它所需要的函数之间是有区别的。nm被用作调试的辅助工具,帮助解决名字冲突和C++名称修饰引起的问题,和验证工具链的其他部分。
GNU计划在GNU Binutils包中提供了一个nm的实现。objdump -t
和readelf -s
也可以查看目标文件的符号表。
nm输出样例
[编辑]下面的例子展示了变量和函数在全局、局部、外部、静态、自动和初始化的不同情况下的不同符号类型。
/* * 文件名: test.c * 对于C代码如下编译: * gcc -c test.c * * 文件名:test.cpp * 对于C++代码如下编译: * g++ -c test.cpp */ int global_var; int global_var_init = 26; static int static_var; static int static_var_init = 25; static int static_function() { return 0; } int global_function(int p) { static int local_static_var; static int local_static_var_init=5; local_static_var = p; return local_static_var_init + local_static_var; } int global_function2() { int x; int y; return x+y; } #ifdef __cplusplus extern "C" { #endif void non_mangled_function() { // I do nothing } #ifdef __cplusplus } #endif int main(void) { global_var = 1; static_var = 2; return 0; }
如果上述代码使用了gcc C编译器来编译,nm -n
命令的输出将把符号按其地址的数值来排序成如下这样:
$ nm -n test.o 0000000000000000 B global_var 0000000000000000 D global_var_init 0000000000000000 t static_function 0000000000000004 b static_var 0000000000000004 d static_var_init 0000000000000008 b local_static_var.1 0000000000000008 d local_static_var_init.0 000000000000000f T global_function 0000000000000033 T global_function2 0000000000000045 T non_mangled_function 0000000000000050 T main
在使用了C++编译器时,输出是不同的:
$nm -n test.o 0000000000000000 B global_var 0000000000000000 D global_var_init 0000000000000000 t _ZL15static_functionv 0000000000000004 b _ZL10static_var 0000000000000004 d _ZL15static_var_init 0000000000000008 b _ZZ15global_functioniE16local_static_var 0000000000000008 d _ZZ15global_functioniE21local_static_var_init 000000000000000f T _Z15global_functioni 0000000000000033 T _Z16global_function2v 0000000000000045 T non_mangled_function 0000000000000050 T main
在二者输出之间的不同还展示了通过在C++代码中使用extern "C"
解决名称修饰问题的一个例子。
符号类型 | 描述 |
---|---|
A | 全局绝对符号 |
a | 局部绝对符号 |
B | 全局bss符号 |
b | 局部bss符号 |
D | 全局数据符号 |
d | 局部数据符号 |
f | 源文件名字符号 |
L | 全局线程本地符号(TLS) |
l | 静态线程本地符号(TLS) |
R | 全局只读符号 |
r | 局部只读符号 |
T | 全局正文符号 |
t | 局部正文符号 |
U | 未定义符号 |