Linux nm命令详解
1、nm命令
nm
命令是Linux
下自带的强大的文本分析工具,是命令来源于name
的简写。该命令用来列出指定文件中的符号(如常用的函数名、变量等,以及这些符号存储的区域)。它显示指定文件中的符号信息,文件可以是对象文件、可执行文件或对象文件库。如果文件中没有包含符号信息,nm
报告该情况,单不把他解释为出错。nm
缺省情况下报告十进制符号表示法下的数字值。
2、nm命令参数详解
nm
命令可选参数如下:
nm [-A|-o|--print-file-name] [-a|--debug-syms][-B|--format=bsd] [-C|--demangle[=style]][-D|--dynamic] [-fformat|--format=format][-g|--extern-only] [-h|--help][-l|--line-numbers] [--inlines][-n|-v|--numeric-sort][-P|--portability] [-p|--no-sort][-r|--reverse-sort] [-S|--print-size][-s|--print-armap] [-t radix|--radix=radix][-u|--undefined-only] [-V|--version][-X 32_64] [--defined-only] [--no-demangle][--plugin name][--no-recurse-limit|--recurse-limit]][--size-sort] [--special-syms][--synthetic] [--with-symbol-versions] [--target=bfdname][objfile...]
参数说明:
- -A/-o/–print-file-name: 在输出时加上文件名;
- -a/–debug-syms: 输出所有符号,包含
debugger-only symbols
; - -B/–format=bsd:
BSD
码显示,兼容MIPS nm
; - -C/–demangle: 将低级符号名解析为用户级名字,可以使得C++函数名更具可读性;
- -D/–dynamic: 显示动态符号。该选项只对动态目标(如特定类型的共享库)有意义;
- -f format/–format=format 使用
format
格式输出。format
可以选取bsd
、sysv
或posix
,该选项在GNU
的nm
中有用。默认为bsd
- -g/–extern-only: 只显示外部符号;
- -l/–line-numbers: 对于每个符号,使用
debug
信息找到文件名和行号; - -n/-v/–numeric-sort: 按符号对应地址的顺序排序,而非按符号名字字符顺序排序;
- -P/–portability: 按照
POSIX2.0
标准格式输出,等同于使用-f posix
; - -p/–no-sort: 按照目标文件中遇到的符号顺序显示,不排序;
- -r/–reverse-sort: 反转排序;
- -s/–print-armap: 当列出库成员符号时,包含索引。索引的内容:模块和其包含名字的映射;
- -u/–undefined-only: 只显示未定义符号;
- –defined-only: 只显示定义了的符号。
3、nm命令使用方法
下面使用的用例时一段简单的c
语言代码,其源码如下:
imaginemiracle@ubuntu:typeof$ cat typeof.c
#include <stdio.h>int func(void)
{return 6;
}int func1(int id)
{return id;
}int main(int argc, char* argv[])
{typeof(func()) id = func();typeof(func1(12)) id1 = func1(12);int a = 1;typeof(a) b = 2; // 获取变量 i 的类型并以此类型定义变量 bint *a1 = &a;typeof(a1) b1 = &b; // 获取变量 a1 的类型并以此类型定义变量 b1printf("id: %d\n", id);printf("id1: %d\n", id1);printf("a: %d\n", a);printf("b: %d\n", b);printf("a1: %d\n", *a1);printf("b1: %d\n", *b1);typeof(1 == a) bool_01 = (1 == a);typeof(2 == a) bool_02 = (2 == a);if (bool_01) {printf("It's true!\n");} else {printf("It's false!\n");}if (bool_02) {printf("It's true!\n");} else {printf("It's false!\n");}return 0;
}
这里我们直接使用nm
命令将a.out
(上文代码编译出的elf
文件)里的符号全部列出。
imaginemiracle@ubuntu:typeof$ nm a.out
0000000000004010 B __bss_start
0000000000004010 b completed.8061w __cxa_finalize@@GLIBC_2.2.5
0000000000004000 D __data_start
0000000000004000 W data_start
00000000000010d0 t deregister_tm_clones
0000000000001140 t __do_global_dtors_aux
0000000000003db0 d __do_global_dtors_aux_fini_array_entry
0000000000004008 D __dso_handle
0000000000003db8 d _DYNAMIC
0000000000004010 D _edata
0000000000004018 B _end
0000000000001378 T _fini
0000000000001180 t frame_dummy
0000000000003da8 d __frame_dummy_init_array_entry
00000000000021e4 r __FRAME_END__
0000000000001189 T func
0000000000001198 T func1
0000000000003fa8 d _GLOBAL_OFFSET_TABLE_w __gmon_start__
000000000000204c r __GNU_EH_FRAME_HDR
0000000000001000 t _init
0000000000003db0 d __init_array_end
0000000000003da8 d __init_array_start
0000000000002000 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
0000000000001370 T __libc_csu_fini
0000000000001300 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5
00000000000011a8 T mainU printf@@GLIBC_2.2.5U puts@@GLIBC_2.2.5
0000000000001100 t register_tm_clonesU __stack_chk_fail@@GLIBC_2.4
00000000000010a0 T _start
0000000000004010 D __TMC_END__
如上面nm
列出的结果中每个符号意义如下:
对于每个符号,nm 显示:
• 符号值,由选项选择的基数(见下文),或默认为十六进制。
• 符号类型。至少使用以下类型;其他的也取决于对象文件格式。如果是小写,符号通常是本地的;如果是大写,则符号是全局的(外部的)。然而,对于特殊的全局符号(“u”、“v”和“w”)
显示了一些小写符号
符号 | 描述 |
---|---|
A | 符号的值是绝对值,不会通过进一步的链接而改变。 |
B/b |
符号在 BSS 数据段中。本节通常包含零初始化或未初始化的数据,尽管确切的行为取决于系统。
|
C | 这个符号很常见。常用符号是未初始化的数据。链接时,多个常用符号可能以相同的名称出现。如果符号在任何地方定义,则常用符号被视为未定义的引用。 |
D/d | 符号在初始化数据段中。 |
G/g |
符号在小对象的初始化数据段中。一些目标文件格式允许更有效地访问小型数据对象,例如全局int 变量,而不是大型全局数组。
|
i |
对于PE 格式文件,这表示符号位于特定于实现的部分中 DLL 。对于ELF 格式文件,这表明该符号是一个间接函数。这是一个GNU 对标准ELF 符号类型集的扩展。它表示一个符号,如果被一个重定位不计算其地址,而是必须在运行时调用。运行时然后执行将返回要在重定位中使用的值。
|
I | 该符号是对另一个符号的间接引用。 |
N | 该符号是调试符号。 |
n | 符号在只读数据段中。 |
p | 符号在堆栈展开部分中。 |
R/r | 该符号位于只读数据段中。 |
S/s | 该符号在小对象的未初始化或零初始化数据段中。 |
T/t | 符号在文本(代码)部分。 |
U | 符号未定义。 |
u |
该符号是唯一的全局符号。这是标准ELF 符号集的GNU 扩展绑定。对于这样的符号,动态链接器将确保在整个过程中只有一个具有此名称和类型的符号正在使用中。
|
V/v | 符号是弱对象。当弱定义符号与正常定义符号链接时,使用正常定义的符号没有错误。当一个弱的未定义符号被链接并且该符号没有定义,弱符号的值变为零,没有错误。在某些系统上,大写表示已指定默认值。 |
W/w | 该符号是一个弱符号,没有被专门标记为弱对象符号。当一个弱定义符号与正常定义符号链接,正常定义符号与没有错误。当一个弱的未定义符号被链接并且该符号未定义时,符号以系统特定的方式确定,没有错误。在某些系统上,大写表示已指定默认值。 |
- |
该符号是a.out 目标文件中的stabs 符号。在这种情况下,打印的下一个值是stabs other 字段、stabs desc 字段和stab 类型。刺符号用于保持调试信息。
|
? |
符号类型未知,或目标文件格式为sp
|
觉得这篇文章对你有帮助的话,就留下一个赞吧^v^*
请尊重作者,转载还请注明出处!感谢配合~
[作者]: Imagine Miracle
[版权]: 本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
[本文链接]: https://blog.csdn.net/qq_36393978/article/details/124104635
Linux nm命令详解相关推荐
- linux mingetty 命令详解
linux mingetty 命令详解 功能说明:精简版的getty. 语 法:mingetty [--long-hostname][--noclear][tty] 补充说明:mingetty适用于本 ...
- linux zip 命令详解
功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期 ...
- linux zipinfo 命令详解
linux zipinfo 命令详解 功能说明:列出压缩文件信息. 语 法:zipinfo [-12hlmMstTvz][压缩文件][文件...][-x <范本样式>] 补充说明:执行zi ...
- Linux chkconfig命令详解
Linux chkconfig命令详解 (2011-03-07 15:49:04) 转载 标签: linux shell chkconfig 杂谈 分类: 工作*Linux chkconfig: ...
- linux uname 命令详解
linux uname 命令详解 功能说明:显示系统信息. 语 法:uname [-amnrsv][--help][--version] 补充说明:uname可显示电脑以及操作系统的相关信息. 参 数 ...
- linux mread 命令详解
linux mread 命令详解 功能说明:将MS-DOS文件复制到Linux/Unix的目录中. 语 法:mread [MS-DOS文件...][Linux文件或目录] 补充说明:mread为mto ...
- linux sort 命令详解
linux sort 命令详解 sort命令的功能是对文件中的各行进行排序.sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的.实际上,sort命令可以被认为 ...
- linux arpwatch 命令详解
linux arpwatch 命令详解 功能说明:监听网络上ARP的记录. 语 法:arpwatch [-d][-f<记录文件>][-i<接口>][-r<记录文件> ...
- linux awk命令详解,使用system来内嵌系统命令,批量github,批量批下载视频, awk合并两列...
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
最新文章
- 前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度
- 用于自动驾驶的实时车道线检测和智能告警
- 防患高通效仿华为,苹果10亿美元收购英特尔手机基带业务!打造5G备胎,加强自主可控...
- JAVA web项目报错no sigar-x86-winnt.dll in java.library.path
- Android Nine-patch
- C程序优化之路(二)
- r2dbc_使用Spring Data R2DBC进行异步RDBMS访问
- python和pytorch是什么关系_【PyTorch】Tensor和tensor的区别
- select2控件动态更新option
- LeetCode 496. 下一个更大元素 I
- 10.26 第二次面试小感
- PostgreSQL与中文社区
- 刚刚,2020年中国信息通信技术服务大会盛大召开!
- Keil下载代码闪退的问题(已解决)
- 【24】基于java的宠物医院管理系统
- 取消磁盘介质写入保护
- 如何在WORD2007中文档中,奇数页页眉是书名,偶数页页眉是章节。各章章节不同,请详细步骤!!!...
- hah4h4h4h4 im her3
- 禅道管理员admin密码登录失败,更改密码
- 使用Grabit自定义SQL收集metadata
热门文章
- 全面的IE兼容性调试问题
- 计算机设计辅助 CAD 试题汇编,计算机辅助设计试题汇编-第二单元
- 【Excel】excel中怎样隔行插入空行?
- 输入一个英文字母(可能是大写,也可能是小写),输出该字母在字母表中的序号(’a’和’A’的序号为1)
- php单选框关联数据库字段_php select,radio和checkbox默认选择的实现方法
- 2019-08-01软件工程总结
- linux查看java虚拟机内存_JVM:查看java内存情况命令
- 阿里云账号注册流程(新手教程)
- GIS空间分析(五)—— 位置与几何关系分析
- MIT Mini Cheetah–开源代码仿真环境搭建记录(Ubuntu20.04)