nm用于列出程序文件中的符号。建立nmtest.c文件:

  1 #include<time.h>2 3 int global1;4 int global2=3;5 6 static int static_global1;7 static int static_global2=3;8 9 void foo()10 {11     static int internal1;12     static int internal2=3;13     time(0);14 }15 16 static void bar()17 {18 19 }2021 int main(void)22 {23     int local1;24     int local2=3;25     foo();26     return 0;27 }执行 gcc -g -c nmtest.c然后

nm的第一列是指程序运行时符号在内存中的地址,它表示函数或变量的开始地址;第二列是指相应的符号放在哪个段,最后一列则是符号的名称。

第二列的信息对我们非常有用,可以让我了解在程序中所定义的一个符号是被放在程序的哪一个段的。下面列出常见字母含义(更多详情man):

上面nm的结果显示,存在地址为0的符号,此时列出的地址由于程序还没完成链接,所以是指符号在对应段中的相对偏移位置。另外,还可以看出time符号没有定义,因为它在c标准库libc.a内。由上可得结论:

无论静态变量是否初始化,程序段的分配方式都是一样的(都在数据段),初始化的静态变量会被分配到.data段中,否则分配在.bss段中;

非静态的全局变量所分配的段只与其是否初始化有关。初始化了则分配在.data段,否则分配在.bss段;

函数无论是静态还是非静态的,总是分配在.test段中,小写t表示静态函数,大写T表示非静态。

函数内的局部变量由于是分配在栈上的,所以在nm中看不到他们的身影。

man是个查询指令的强大工具~~~

执行gcc -g nmtest.c -o test

nm -n test

发现global1的变量的分配空间从前面的C变成了B,time符号从无定义变成了分配在.test段中。

nm命令:

选项/属性:
-a或--debug-syms:显示调试符号。
-B:等同于--format=bsd,用来兼容MIPS的nm。
-C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
-D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
-f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
-g或--extern-only:仅显示外部符号。
-n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
-p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。
-P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
-s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
-r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。
--size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
-t radix或--radix=radix:使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。
--target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
-u或--undefined-only:仅显示没有定义的符号(那些外部符号)。
-l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
-V或--version:显示nm的版本号。
--help:显示nm的任选项

转载于:https://www.cnblogs.com/yangguang-it/p/6443898.html

binutils工具集之---nm相关推荐

  1. binutils工具集用法

    addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...

  2. binutils工具集

    如果使用 gcc 作为编译器,那么 binutils 就是必不可少的一个工具集.工具集中的部分工具除了被 gcc 在后台使用为我们创建程序文件(目标文件.库文件或可执行程序)外,其它的则有助于方便开发 ...

  3. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  4. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

  5. 嵌入式软件开发杂谈(4):Binutils工具集

    文章目录 1 addr2line 2 nm 3 readelf 3.1 -h 3.2 -l 3.3 -S 3.4 -t 3.5 -s 3.6 -n 3.7 -d 4 size 5 objdump 6 ...

  6. Binutils工具集 解析

    对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高.目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器.除了GCC,还有一个非常 ...

  7. GNU binutils工具集

    前言 GNU binutils工具提供了一系列二进制工具,用于日常开发过程中对程序调试和维护,经常会用到的工具如下: as:汇编编译器,用于将汇编代码编译成目标文件; addr2line:用于得到程序 ...

  8. GNU工具链简介(GCC编译器+Binutils工具集+GDB调试器+make工具)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.什么是工具链 在软件工程中,工具链(toolchain)是一系列用于制作软件的工具.它包括用来编辑源代码的文本编辑器.生成可执行文件的编译器 ...

  9. binutils工具集——ld的用法

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考内容 https://www.cnblogs.com/huqingyu/archive/2005/02/28/110468.html 一.工 ...

最新文章

  1. flume 1.7在windows下的安装与运行
  2. shell中变量的替换
  3. Python小游戏(俄罗斯方块)
  4. Java二分查找、折半查找
  5. 【Flask】Nginx / Gunicorn入门:部署你的Flask项目
  6. centos 7 防火墙和端口配置
  7. 「Python-Django」django 实现将本地图片存入数据库,并能显示在web上
  8. mongodb备份和恢复:mongodump/mongorestore ( 二)
  9. 数据库系统概论第五版习题解析
  10. 骇基-黑客攻防实战入门⑴
  11. solidity教程【0.5.7】
  12. 挑战性价比,刷新你对千元级投影仪的认知,这份详细评测送给你
  13. vue随笔1-element-UI中checkbook多选框-复选框样式修改
  14. 计算机里什么是目录,c盘perflogs是什么文件夹_电脑中perflogs文件夹能删除吗-win7之家...
  15. 做多应用层,做多WEB3华人创业者
  16. Pycharm提示“typo:in word“的意思
  17. python正则匹配连续相同字符_正则表达式: 匹配n个相同连续字符
  18. Java学习笔记22:并发(2)
  19. Android Animations动画使用详解
  20. 2021-11-15 入门前端VScode必装的常用插件, HTML+CSS常用属性速记.

热门文章

  1. 洛谷P2016战略游戏
  2. 009Linux密码故障排除
  3. WebRTC 音视频开发之路
  4. WPF将Ui保存为图片和保存位图
  5. Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中
  6. inux读取ISO文件或是光驱的方法--挂载
  7. Android中GridView使用总结
  8. Flutter 34: 图解自定义 View 之 Canvas (一)
  9. 51CTO博客移动化意味着什么?IT博主可以搞事情了!
  10. 通过IEnumerable和IDisposable实现可暂停和取消的任务队列