linux命令nm
-
nm(Symbol Table Utils)是一个在Linux系统中常用的命令行工具,用于查看目标文件或可执行文件中的符号表信息。它能够显示文件中的全局变量、函数、静态变量和外部变量等信息。
nm命令的基本语法如下:
nm [options] file
其中,options为命令的可选参数,file为要查看符号表的文件名。
nm命令常用的选项有:
– -A或–print-file-name:显示每个符号所在的文件名;
– -a或–debug-syms:打印出所有的符号,包括调试符号;
– -B或–format=sysv:使用类SysV式的输出格式;
– -C或–demangle:解码C++函数名的缩写;
– -D或–dynamic:显示动态符号;
– -f或–with-undefined:只显示未定义的符号;
– -g或–extern-only:只显示外部链接的符号;
– -l或–line-numbers:显示每个符号名称对应的源代码行号;
– -p或–no-sort:不进行符号表的排序;
– -r或–reverse-order:反向显示符号表;
– -u或–defined-only:只显示已定义的符号;
– -v或–verbose:显示详细的输出。nm命令可以用于查看目标文件或可执行文件中的符号表信息,对于开发者来说,该命令非常有用。它可以帮助我们了解程序所引用的外部函数、全局变量等信息,从而更好地进行代码分析和调试工作。在Linux系统中,nm命令常常与其他工具配合使用,如objdump、readelf等,在各种编程和调试场景下发挥着重要作用。
2年前 -
nm命令是Linux系统中的一个工具,用于显示一个二进制文件(如可执行程序、共享库、目标文件)中的符号表。这个命令可以列出每个符号的名称和地址,以及符号的类型和绑定属性。下面是关于nm命令的一些重要信息:
1. 命令语法:nm [选项] <文件>
命令选项包括:
-a 或 –debug-syms:显示所有符号,包括调试符号。
-D 或 –dynamic:只显示动态符号。
-g 或 –extern-only:只显示全局符号。
-l 或 –line-numbers:显示每个符号的行号。
-C 或 –demangle:解码C++函数名。
-p 或 –print-size:显示每个符号的大小。2. 符号类型的解释:
– U:未定义的符号,需要从其他地方解析。
– W:弱符号,可能被其他符号覆盖。
– A:绝对符号,即其地址在编译时已经确定。
– T:文本段符号,表示一个函数或程序的入口点。
– D:数据段符号,表示一个初始化的全局或静态变量。
– B:BSS段符号,表示一个未初始化的全局或静态变量。
– C:构造函数或析构函数。
– G:全局符号。3. 符号绑定属性的解释:
– LOCAL:局部符号,只在当前模块中可见。
– GLOBAL:全局符号,可以在其他模块中引用。
– WEAK:弱符号,可以被其他模块覆盖。
– DEFAULT:默认符号,与全局符号具有相同的绑定属性。4. 应用场景:
– 查看一个二进制文件中的符号,以便分析其结构和依赖关系。
– 找出共享库中缺失的符号,以解决链接错误。
– 调试程序时,跟踪函数的调用关系和地址。5. 示例命令:
– nm helloWorld:显示可执行文件helloWorld中的符号表。
– nm -D libtest.so:只显示共享库libtest.so的动态符号。
– nm -C -l myProgram.o:显示目标文件myProgram.o的符号和行号,并对C++函数名进行解码。
– nm -g -p a.out:只显示可执行文件a.out中的全局符号,并显示每个符号的大小。总的来说,nm命令是一个非常有用的工具,在Linux开发和调试过程中经常用到,可以帮助开发人员深入理解和分析二进制文件的结构和依赖关系,从而提高代码的可维护性和性能。
2年前 -
Linux命令”nm”用于显示目标文件或者可执行文件中的符号表。符号表记录了目标文件中定义的函数、全局变量和静态变量的信息。nm命令可以帮助我们查找某个函数或者变量在文件中的具体位置,方便我们进行调试和查找bug。
下面让我们详细介绍一下nm命令的使用方法。
### 1. 语法
nm命令的语法如下:
“`
nm [选项] [文件名]
“`### 2. 选项
nm命令的常用选项如下:
– `-A` 或 `–debug-syms`:显示所有调试符号。
– `-a` 或 `–debug-syms`:显示所有调试符号,并包括局部符号。
– `-C` 或 `–demangle`:将C++的符号名进行反解析。
– `-D` 或 `–dynamic`:显示动态符号。
– `-f` 或 `–with-filename`:显示每个符号所在的文件名。
– `-g` 或 `–extern-only`:只显示外部引用的符号。
– `-n` 或 `–numeric-sort`:按照数字排序。
– `-o` 或 `–print-file-name`:打印文件名。
– `-p` 或 `–portability`:允许在不同的系统上进行移植。
– `-r` 或 `–reverse-sort`:按照相反的顺序排序。
– `-s` 或 `–size-sort`:按照符号大小排序。
– `-u` 或 `–undefined-only`:只显示未定义的符号。
– `-v` 或 `–version`:显示版本信息。
– `-V` 或 `–version`:显示版本号。
– `-w` 或 `–no-sort`:不进行排序,按照文件中的顺序显示符号。### 3. 操作流程
使用nm命令可以分为以下几个步骤:
Step 1: 打开终端
首先,打开终端,进入命令行环境。
Step 2: 输入命令
在命令行中输入nm命令,后面跟上需要查看符号表的文件名,例如:
“`
nm test.o
“`上述命令将会显示test.o文件中的符号表信息。
Step 3: 分析输出
执行命令后,终端会显示文件中的符号表信息。每一行代表一个符号,包含符号的地址、类型和名称。
地址列显示符号的地址,类型列展示符号的类型,名称列显示符号的名称。
根据需要可以使用不同的选项来过滤并排序符号表的输出。
### 4. 示例
让我们通过一个示例来更好地理解nm命令的使用。
假设我们有一个源文件test.c,内容如下:
“`c
#includevoid foo()
{
printf(“Hello, World!\n”);
}int main()
{
foo();
return 0;
}
“`我们首先需要将该源文件编译为可执行文件。打开终端,进入源文件所在的目录,使用gcc编译源文件,命令如下:
“`
gcc test.c -o test
“`编译完成后,我们得到一个名为test的可执行文件。
接下来,使用nm命令查看可执行文件中的符号表信息,命令如下:
“`
nm test
“`终端将会显示如下的符号表信息:
“`
0000000000400526 T _GLOBAL_OFFSET_TABLE_
00000000004006d4 R __FRAME_END__
00000000004006e0 D _edata
00000000004006e8 B _end
0000000000400480 T _start
00000000004004a0 t deregister_tm_clones
00000000004004d0 t register_tm_clones
0000000000400510 T __do_global_dtors_aux
0000000000400530 T frame_dummy
000000000040057d T foo
0000000000400590 T main
0000000000400640 T __libc_csu_init
00000000004006a0 T __libc_csu_fini
00000000004006a4 U __libc_start_main@@GLIBC_2.2.5
00000000004006b0 U printf@@GLIBC_2.2.5
“`上述输出中,每一行对应一个符号。以地址为例,地址列中的开头字符可以是`T`、`W`、`B`、`G`等等。`T`表示该符号在文本(程序代码)段,`D`表示在数据段,`B`表示在BSS段,`R`表示在只读数据段,`U`表示这个符号未被定义。
对于该示例中的符号表输出,`foo`和`main`分别对应源文件test.c中的函数foo和main。可以看到,nm命令帮助我们找到了这两个函数的地址。
### 5. 总结
通过本文,我们学习了Linux命令nm的基本使用方法。nm命令可以显示目标文件或者可执行文件中的符号表信息,帮助我们了解和分析代码的结构和功能。
标号的格式通常包括符号的地址、类型和名称。我们可以通过不同的选项来过滤和排序符号表的输出,提高分析的效率。
使用nm命令,我们可以在Linux环境中更加灵活和高效地进行程序调试和代码分析。希望本文对您在使用nm命令时有所帮助。
2年前