nm命令使用详解,让你加快学习速度

news2025/7/26 7:25:16

nm 命令详解

符号是每个ELF文件的一个重要部分,因为它保存了程序实现或使用的所有(全局)变量和函数。符号表中保存了查找程序符号、为符号赋值、重定位符号所需要的全部信息。Linux中 nm用来列出目标文件的符号表;如果nm指令没有指出目标文件,则nm假定目标文件是a.out

1.语法:

nm(选项)(参数)

2.输出

对于每个符号,nm显示:

·符号值,以选项(见下文)选择的基数,或默认为十六进制。

·符号类型。 至少使用以下类型; 其他也是,取决于目标文件格式。

如果是小写,则符号通常是本地的; 如果是大写,则符号为全局(外部)。然而,有一些为特殊全局符号( u , v 和 w )显示的小写符号。

3.选项

nm的用法很简单,以下几个关键字比较常用:

(1)"-A",列出符号名的时候同时显示来自于哪个文件。

这在同时列出多个文件(比如一个链接库)的符号时比较有用

(2)"-a",列出所有符号

这将会把调试符号也列出来。默认状态下调试符号不会被列出。

(3)"-l",列出符号在源代码中对应的行号

指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空

(4)"-n",根据符号的地址来排序

默认是按符号名称的字母顺序排序的

(5)"-u",只列出未定义符号

同"--undefined-only",而"--defined-only"将只列出已定义符号

4.示例

test.c

test.h

main.c

好, 我们再来看看全局变量的情形, 我们把main.c改为:

1. #include

2. int add(int x, int y)

3. {

4. return x + y;}

5. int aaa;

6. int bbb = 1;

7. char szTest[] = "good";

8. int main()

9. {

10. int ccc = 2;

11. return 0;

12.}

然后用nm分析a.out(注意, 如果只有nm命令, 则默认a.out为其要处理的文件):

1. fs@localhost learn_nm $ ls

2. main.c

3. fs@localhost learn_nm $ gcc main.c

4. fs@localhost learn_nm $ ./a.out

5. fs@localhost learn_nm $ nm a.out

6. 08049538 d _DYNAMIC

7. 08049604 d _GLOBAL_OFFSET_TABLE_

8. 0804847c R _IO_stdin_used

9. w _Jv_RegisterClasses

10.08049528 d __CTOR_END__

11.08049524 d __CTOR_LIST__

12.08049530 D __DTOR_END__

13.0804952c d __DTOR_LIST__

14.08048520 r __FRAME_END__

15.08049534 d __JCR_END__

16.08049534 d __JCR_LIST__

17.08049628 A __bss_start

18.08049618 D __data_start

19.08048430 t __do_global_ctors_aux

20.08048310 t __do_global_dtors_aux

21.08048480 R __dso_handle

22. w __gmon_start__

23.0804842a T __i686.get_pc_thunk.bx

24.08049524 d __init_array_end

25.08049524 d __init_array_start

26.080483c0 T __libc_csu_fini

27.080483d0 T __libc_csu_init

28. U __libc_start_main@@GLIBC_2.0

29.08049628 A _edata

30.08049634 A _end

31.0804845c T _fini

32.08048478 R _fp_hw

33.08048274 T _init

34.080482e0 T _start

35.08049630 B aaa

36.08048394 T add

37.0804961c D bbb

38.08049628 b completed.5963

39.08049618 W data_start

40.0804962c b dtor_idx.5965

41.08048370 t frame_dummy

42.080483a2 T main

43.08049620 D szTest

44.fs@localhost learn_nm$

可以看到, 不仅有add函数, 还有全局变量aaa, bbb和szTest, 要注意, aaa是未初始化的, 所以在Bss段, 而bbb、szTest是初始化了的,所以在Data段。 值得注意的是, 并没有ccc, 因为ccc是局部变量, nm看不到的。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟电路设计(34)---脉宽调制型开关电路

在开关稳压电源中,直流变换器中的功率晶体管工作在开关状态。目前开关电源的工作频率在几百kHz,有些甚至已经到了MHz量级。如下图所示是DC-DC开关变换器的原理框图: ​DC-DC开关变换器的原理框图 开关电源的实现方式有很多种,如最…

[附源码]Python计算机毕业设计二手图书回收销售网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Spring:AOP事务管理(14)

Sprin事务Spring事务简介相关概念介绍转账案例-需求分析转账案例-环境搭建事务管理Spring事务角色Spring事务属性事务配置转账业务追加日志案例事务传播行为Spring事务简介 相关概念介绍 事务作用:在数据层保障一系列的数据库操作同成功同失败。Spring事务作用&am…

电子作业票系统:消除安全管理漏洞,科技赋能企业业务洞察

电子作业票系统采用定位、物联网、人脸识别、大数据技术对现场作业进行严格管控;通过风险大数据风险辨识模型,实现作业风险辨识,对动火、高处、受限空间、临时用电、吊装、断路、管线打开、挖掘作业等特殊作业票证智能化管理。 在危化企业实际…

Excel VS BI,谁才是真正的大数据分析工具?

有人说,Excel能聚合运算,能分析,能做数据分析报表。而BI数据分析工具,看上去也就是做出来的报表更好看一些。事实真的是这样吗?当然不是。外行人看热闹,内行人看门道,BI数据分析工具比起Excel更…

访问权限控制

访问控制目的 在实际的组织中,为了完成组织的业务工作,需要在组织内部设置不同的职位,职位既表示一种业务分工,又表示一种责任与权利。根据业务分工的需要,职位被划分给不同群体,各个群体的人根据其工作任…

零代码极限封装的【接口自动化测试框架】震碎你的三观

随着互联网寒冬的到来,测试行业裁员的裁员,找工作的找工作,内卷越来越加剧,那么选择一个学习提升的平台尤为重要,接下来我要说的事情将震碎你的三观,震掉你的眼球,和每个测试人息息相关&#xf…

图像处理 QImage

在Qt中有四种处理图像的方法: QImage :使用I/O ,可以对像素进行处理QPixmap:主要用在屏幕的显示QBitmap: QPixmap的子类,处理颜色深度,只能显示黑白两种颜色,用于遮罩QPicture&…

Qt通过Doc模式读取XML并设计一个增删改查方便的一个操作类

前言 如果对开源库TinyXml有兴趣的可以去看看这篇文章。 C使用TinyXml(开源库)读取*.XMl文件 目录前言DOC 文档对象模型QtXML基本结构操作XML部署环境添加信息头读取XML文件添加根节点添加一个没有属性的节点添加一个有属性的节点添加一个元素节点给节点单独设置属性删除所有同…

开源软件安全与应对策略探讨 - Java 机密计算技术应用实践

据统计,90% 以上的应用都在使用第三方软件库,这些软件大部分都是开源的。与此同时,有超过一半的全球 500 强公司都在使用存在漏洞的开源软件。这幅漫画生动的描述了一个大型应用软件的组件架构,它可能建立在一个极其脆弱的开源组件…

SpringBoot整合Swagger2+Knife4j,注解使用

SpringBoot整合Swagger2Knife4j,注解使用 文章目录SpringBoot整合Swagger2Knife4j,注解使用前言一、swagger是什么?二、使用步骤1.引入库2.使用swagger的相关注解总结前言 swagger和postman都是后端编写的测试接口使用方式,由于实际开发的需求和使用习惯…

基于springboot的汽车租赁管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

pytorch实现mnist手写数字识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章地址: 365天深度学习训练营-第P1周:mnist手写数字识别🍖 作者:K同学啊一、 前期准备 1. 设置GPU import torch import torch.nn a…

MySQL8.0爬坑二三事

【下载】 地址:MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 【安装】 1.解压复制下面一堆文件到你需要的路径 2.如下图添加一个data文件夹,专门来放数据 3.新建一个my.ini的配置文件,里面内如如下 4…

如何将草料二维码收集到的表单信息同步至腾讯文档

在进行工业巡检场景如消防栓检查时,需要到达巡检地点后,扫描草料二维码,然后填写巡检的结果。事后,还需要有一个工作人员将草料二维码中的信息手动复制粘贴至腾讯文档中。那么能不能将我们信息填写后,自动就汇总至腾讯…

检索系统设计方案(重构)

记一次系统重构设计背景介绍设计步骤架构图介绍架构设计注意点总结背景介绍 搜索链路主要部分 搜索引擎链路都包含这三部分,数据源、搜索引擎服务、搜索业务。 是不是很简单,感觉搜索也没那么难? 搜索链路确实都包括这三部分,…

编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

我最开始当程序员用C语言写代码,公司里推行编码规范,变量的前缀都是有规定的。 比如整型变量,前面都是 u8Name, i8Name, u16Name, i16Name之类的。 尤其是嵌入式编程,涉及到代码移植的问题,最好使用和平台无关的类型定…

显存优化综述

显存优化综述动态图和静态图静态图显存优化动态图显存优化DTR问题解决办法重计算的局限性Cooprecomputable in placeop-guided allocationLayout-aware Eviction实验效果消耗的时间显存碎片率搜索时间动态图和静态图 动态图是边计算边搭建计算图,中间结果一目了然。…

Quasar搭建教程初体验

文章目录一、Quasar框架介绍二、搭建一个简单的Quasar程序1、Quasar CLI安装2、创建Quasar应用程序3、运行Quasar三、使用Quasar开发SSR四、使用Quasar开发桌面应用(Electron)1、添加Quasar Electron模式2、运行开发五、使用Quasar移动应用(Capacitor)1、下载安装AndroidStudio…

测试用例设计方法之判定表法

概念: 等价类,边界值分析法一般是对单一输入进行测试用例分析的方法。 判定表是对其的一种补充,对于多种输入之间存在的组合关系并且对应执行不同动作,进行测试用例的分析的方法。 应用场景: 当一个界面中有多个控…