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

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。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理免费领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

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

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

相关文章

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目,本来不管作者事儿的,但是后来听到说是室友去网上找人花了80块买了个劣质的,不仅是从CSDN上抄的,而且使用的板子还不符合室友的要求。可叹作者心软啊,顺便给室友做了。 在代码实现部分会给出设…

智能优化算法应用:基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.纵横交叉算法4.实验参数设定5.算法结果6.…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI,是一种由人制造出来的机器,该机器可以模仿人的思想和行为,从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括:芯片、大数据、算法系统、网络等多项基础…

【Gradle】创建第一个项目

文章目录 1. 前提2. 创建项目并初始化1)创建项目2)初始化项目 3. 介绍生成的文件结构4. 执行5. 包的作成 (非必须)6. 推送(非必须) 本节将继 Gradle 之初体验 安装之后,创建第一个 Hello World…

C++计算(a+b)*(c-b)的值 2023年9月c++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C计算(ab)*(c-b)的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C计算(ab)*(c-b)的值 2023年9月 C编程等级考试一级编程题 一、题目要求 1、编程实现 给定3个整数a、b、c,计算表达…

[Android] ubuntu虚拟机上搭建 Waydroid 环境

1.安装虚拟机 略 2.安装waydroid Ubuntu/Debian and derivatives For Droidian and Ubuntu Touch, skip directly to the last step Install pre-requisites sudo apt install curl ca-certificates -y Add the official repository curl https://repo.waydro.id | sudo…

晚期食管癌肿瘤治疗线程分类

文章目录 1、肿瘤治疗的线数1.1 基础概念1.2 线程定义1.3 如何计算治疗线数 2 食管癌治疗指南2.1 食管癌诊疗指南2.1 CSCO 本文前半部分主要来源于参考文件1,其余部分来源于官方指南。无原创内容,全部为摘要。 1、肿瘤治疗的线数 1.1 基础概念 抗肿瘤药…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢,打开应用的一瞬间会出现白屏,以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

GZ015 机器人系统集成应用技术样题5-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书(学生赛) 样题5 选手须知: 本任务书共 24页,如出现任务书缺页、字迹不清等问题,请及时向裁判示意,并进行任务书的更换。参赛队…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表 剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表解法1:中序遍历 - 递归解法2:中序遍历 - 迭代 剑指 Offer(第2版&am…

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

【CMU 15-445】Lecture 12: Query Execution I 学习笔记

Query Execution I Processing ModelsIterator ModelMaterialization ModelVectorization Model Access MethodsSequential ScanIndex Scan Modification QueriesHalloween Problem 本节课主要介绍SQL语句执行的相关机制。 Processing Models 首先是处理模型,它定义…

基于JAVA+SpringBoot+Vue的前后端分离的学校请假管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 系统分为四个角色&…

机器学习 | 决策树 Decision Tree

—— 分而治之,逐个击破 把特征空间划分区域 每个区域拟合简单模型 分级分类决策 1、核心思想和原理 举例: 特征选择、节点分类、阈值确定 2、信息嫡 熵本身代表不确定性,是不确定性的一种度量。 熵越大,不确定性越高,…

MIT6.S081-实验准备

实验全程在Vmware虚拟机 (镜像:Ubuntu-20.04-beta-desktop-amd64) 中进行 一、版本控制 1.1 将mit的实验代码克隆到本地 git clone git://g.csail.mit.edu/xv6-labs-2020 1.2 修改本地git配置文件 创建github仓库,记录仓库地址 我的仓库地址就是htt…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程(一)https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局,通…

饥荒Mod 开发(十):制作一把AOE武器

饥荒Mod 开发(九):物品栏排列 饥荒Mod 开发(十一):修改物品堆叠 前面的文章介绍了很多基础知识以及如何制作一个物品,这次制作一把武器,装备之后可以用来攻击怪物。 制作武器贴图和动画 1.1 制作贴图。 先准备一张武器的贴图&a…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决:AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退(不推荐&#…

鸿蒙4.0核心技术-WebGL开发

场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理,比如绘制彩色图形等。 接口说明 表1 WebGL主要接口列表 接口名描述canvas.getContext获取canvas对象上下文。webgl.createBuffer(): WebGLBuffernullwebgl.bindBuffer(target: GLenum, buffer: …

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二):一键制作 饥荒Mod 开发(十四):制作屏幕弹窗 一键传送源码 饥荒的地图很大,跑地图太耗费时间和饥饿值,如果大部分时间都在跑图真的是很无聊,所以需要有一个能够传送的功能,不仅可以快速…