二进制工具:nm_列出目标文件中的符号表]

Ubuntu 上多种版本的 gcc/g++ 切换/安装 Ubuntu安装并切换到高版本的gcc/g++ 阅读详情

一.nm介绍

nm用来列出目标文件的符号清单.这里的目标文件,一般是指.a扩展名的静态连接库文件和编译过的目标文件.
linux下的有两种库文件,一种是动态连接库(.so),一种是静态连接库(.a).
nm就是可以用来显示一个静态连接库中符号列表的工具.

二.nm基本用法

下面以一个例子介绍nm的使用方法.

1.编写源文件

分别建立2个文件,bill.c和fred.c.

//bill.c
#include <stdio.h>
void bill(char *arg)
{
  printf("bill: you passed %s\n",arg);
}
// fred.c
#include <stdio.h>
void fred(int arg)
{
  printf("fred: you passwd %d\n",arg);
}

2.编译为目标文件

# gcc -c bill.c fred.c
# nm bill.o
0000000000000000 T bill
                 U printf

3.制作成静态库

# ar crv libfoo.a bill.o fred.o
# nm libfoo.a
bill.o:
0000000000000000 T bill
                 U printf

fred.o:
0000000000000000 T fred
                 U printf

三.nm命令的格式

nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap]
[-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort]
[-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix]
[-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]

  如果没有为nm命令指出目标文件,则nm假定目标文件是a.out.下面列出该命令的任选项,大部分支持"-"开头的短格式和"—"开头的长格式.

-A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次.

-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的任选项. 

   对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。

符号
类型
说明
A
该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。
B
该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM中
C
该符号为common。common symbol是未初始话数据段。该符号没有包含于一个普通section中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个c文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C。否则其类型为B。
D
该符号位于初始话数据段中。一般来说,分配到data section中。例如定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中。
G
该符号也位于初始化数据段中。主要用于small object提高访问small data object的一种方式。
I
该符号是对另一个符号的间接引用。
N
该符号是一个debugging符号。
R
该符号位于只读数据区。例如定义全局const int test[] = {123, 123};则test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,源文件中的test对应目标文件的test,即没有添加下划线,并且其符号类型为R。一般而言,位于rodata section。值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,test在rodata section中,大小为4。
S
符号位于非初始化数据区,用于small object。
T
该符号位于代码区text section。
U
该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U。
V
该符号是一个weak object。
W
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-
该符号是a.out格式文件中的stabs symbol。
?
该符号类型没有定义

【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 详细使用介绍】 objcopy 是 GNU二进制工具集(binutils)的一部分,主要用于复制和转换目标文件。在ARM GCC中,通常用于从链接后的ELF格式文件中提取出二进制文件或其他格式的内容,这对于嵌入式开发特别有用,因为这样的文件可以直接烧写到微控制器的闪存中。GCCobjdump用于显示关于目标文件的信息。这些信息包括文件的头部信息、节区内容、符号表、重定位入口点等。使用objdump可以对二进制文件进行深入分析,这对于调试和理解程序的工作原理非常有用。 阅读详情

相关推荐

动态库、可执行文件符号表分析

1. 动态库编译 基本思路为: 先编写两个C文件,其中各自实现几个函数,变量,然后将其分别编译为动态库; 再编写一个实现main函数的C文件,分别调用上述第一步动态库中的函数; 分析最后的可执行文件和动态库文件的符号表; 1.1 第一个C文件:basic.c 这个C文件只定义并实现了四个不同形参的函数、五个静态变量、一个全局变量。由于只关心符号表或者其他二进制内容,因此不具体实现特定功能...

遇见你是我最美丽的意外 8354

gcc工具链nm符号工具简介

[root@Centos]$ nm -n /home/ABC.exe &gt; nm.txt // -n 按地址顺序排序,导出 //cat 符号表 00000000049908a0 B g_GetUserInfo 0000000004990947 B gsNum 0000000004990948 B gsFT2 0000000004990949 B gsFT1 000000000499095...

Oliver King 的小窝 7394

gcc:工具 nm/ldd/readelf/patchelf/ld.so/ldconfig/as/c++filt/objdump/strip/addr2line/size/objcopy

链接器的启动,有两种方式:一种就是直接执行ld.so,一种是运行通过动态链接生成的应用程序或者动态库(这种方式不能传递参数给链接器,在elf格式下,连接器的信息存在.interp头部);这里需要注意,strip之后,的文件不再是之前的文件,所以之前文件的secap的权限,会丢失。这个含义是说,链接在遇到错误时,不会中断,会继续做链接,可以将所有的链接错误都找出来。

mzhan017的博客 1257

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf  如果普通编程不需要了解这些东西,如果想精确控制你的目标文件的格式或者你想查看一下文件里的内容以便作出某种判断,那么你可以看一下下面的工具:ar,nm,objdump,objcopy。具体用法请参考man在线手册。 ar基本用法     ar命令可以用来创建

sosohit的专栏 1572

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3714

STM32新手必看:3分钟搞定ST官网资料下载(附F0系列手册+外设库下载技巧)

本文为STM32开发新手提供高效获取ST官网技术资料的完整指南,重点介绍如何快速下载STM32F0系列数据手册和外设库。通过系统性的资源分类解析和实用下载技巧,帮助开发者快速定位所需文档,建立本地知识库,提升开发效率。

ujm5678901的博客 270

linux 二进制文件符号,二进制工具:nm_列出目标文件中的符号表

一.nm介绍nm用来列出目标文件的符号清单.这里的目标文件,一般是指.a扩展名的静态连接库文件和编译过的目标文件.linux下的有两种库文件,一种是动态连接库(.so),一种是静态连接库(.a).nm就是可以用来显示一个静态连接库中符号列表的工具.===== 二.nm基本用法 =====下面以一个例子介绍nm的使用方法.==== 1.编写源文件 ====分别建立2个文件,bill.c和fred.c...

weixin_39625709的博客 474

Ships Dataset:解锁海洋探索的数字宝库

在海上交通管理中,通过对船舶的持续跟踪,可以及时发现船舶的异常行为,如偏离航线、超速等,保障海上航行的安全。例如,通过分析船舶的航行数据和位置信息,合理安排船舶的停靠时间和装卸货物顺序,避免港口拥堵,提高船舶的周转率。同时,还精确标注了船舶在图像中的位置坐标,通过这些坐标,我们可以准确地定位船舶在图像中的具体位置,为后续的分析和处理提供了精确的依据。从繁忙运输货物的货船,到承载着能源使命的油轮,再到穿梭于海洋寻找鱼群的渔船 ,每一种船舶都有着独特的外形和功能,在数据集中留下了它们的身影。

qq_38220914的博客 1267

怎么查看二进制文件内容?linux下nm命令告诉你!

linux下强大的文件分析工具 -- nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 目标文件 :常说的目标文件是我们的程序文件(.c/.cpp,.h)经过预编译,编译...

did59261的博客 6873

LLC谐振变换器设计实战:从工作原理到参数设计与调试

开关电源设计是电力电子领域的核心技术,其核心目标在于提升效率与功率密度。为实现这一目标,软开关技术应运而生,它通过精心控制开关器件的电压与电流波形,使其在开通或关断瞬间实现零电压或零电流切换,从而从根本上降低开关损耗。LLC谐振变换器正是这一技术的杰出代表,它通过引入谐振网络,巧妙地实现了主开关管的零电压开关和次级整流管的零电流开关。这种拓扑结构在服务器电源、通信设备及高端显示驱动等要求高效率、高功率密度的应用场景中价值显著。本文将以半桥LLC为例,深入剖析其工作模态与增益特性,并系统阐述其参数设计、仿真验

weixin_34129696的博客 564

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 999

linux命令之nm显示二进制目标文件的符号表

nm命令编程开发nm命令被用于显示二进制目标文件的符号表。语法nm(选项)(参数)选项-A:每个符号前显示文件名; -D:显示动态符号; -g:仅显示外部符号; -r:反序显示符号表。参数目标文件:二进制目标文件,通常是库文件和可执行文件。...

风清扬 2322

开源3D激光SLAM算法的异同点、优劣势与适配场景总结

本文对比分析了主流开源3D激光SLAM方案的核心差异与适用场景。LOAM架构简洁但精度较低;LeGO-LOAM轻量化适合地面机器人;LIO-SAM采用因子图优化支持多传感器融合;LVI-SAM通过视觉-激光-惯性三重冗余提升鲁棒性;FAST-LIO系列基于滤波架构实现超高实时性。选型需权衡传感器配置(纯激光/激光+IMU/激光+视觉)、运动状态(高速/常规)、计算资源等因素:资源受限选LeGO-LOAM或Faster-LIO,高速运动选FAST-LIO系列,退化环境选LVI-SAM,全局一致性需求选LIO-

Studying…… 651

linux目标文件,Linux/Unix下显示二进制目标文件的符号表

nm查看二进制目标文件符号表的标准工具是nm,可以执行下列命令查看二进制目标文件(.o)/静态库(.a)/动态库(.so)的符号表:nm -g yourObj.onm -g yourLib.anm -g yourLib.soC/C++语言在C++编译器编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。例如std::string::size()经过修饰后是_ZNK...

weixin_34024555的博客 914

LabVIEW实现TCP通信

在本节中,我们将简要探讨TCP通信的基础知识,并以工业物联网平台TLINK中的云端设备数据发布设计为例,详细阐述在互联网环境下TCP客户端应用程序设计的基本方法。

不脱发的程序猿 1964

245. 项目195:简易文字冒险游戏——《跟老吕学Python·新手》

如果您在学习本专栏教程时遇到任何问题,或有任何技术交流的意愿,欢迎在文章评论区留言,或通过优快云私信与老吕取得联系。老吕将及时回复您的留言,并与您共同探讨,以期为大家提供更为精准和有效的帮助。老吕珍视每一位读者的反馈和支持,期待与您共同学习、共同进步,共同创造美好的未来!我们的目标是不仅教会您Python语言,更是培养您解决问题的思维方式。请随意翻阅,按照自己的节奏学习,让这本专栏成为您编程旅程中的可靠伙伴。开发一个简易的文字冒险游戏,通过文本描述场景和事件,让玩家通过选择不同的选项来推动故事发展。

Python老吕的博客 713

nm命用于显示二进制目标文件的符号表

nm命令被用于显示二进制目标文件的符号表。  【语法】      nm(选项)(参数)  【选项】      -A:每个符号前显示文件名;       -D:显示动态符号;       -g:仅显示外部符号;       -r:反序显示符号表。 【参数 】       目标文件:二进制目标文件,通常是库文件和可执行文件。 来自: http://man

jichenchen1990的专栏 2105

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

nm、readelf、objdump哪个强?符号表查看工具终极对比

掌握符号表的查看技巧,快速定位程序调试与逆向分析难题。对比nm、readelf、objdump三大工具在ELF文件解析中的适用场景、输出格式与功能优势,帮你选出最趁手的利器。效率提升显著,值得收藏。

CodeIsle的博客 1004

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux下的文件分析工具 -- nm

linux下的文件分析工具 -- nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 目标文件:常说的目标文件是我们的程序文件(.c/.cpp,.h)经过预编译,编译,汇编过程生成的二进制文件,不经过链接过程,编译生成指令为: gcc(g++) -c file.c(file..

abcx3261的博客 1163

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux调试高手进阶】:从符号表看起,洞悉二进制真相

掌握Linux调试关键技能,从符号表的查看入手,深入分析二进制文件结构。适用于程序崩溃定位、性能调优等场景,详解readelf、nm、gdb等工具使用方法,快速定位函数与变量。洞悉底层运行机制,提升调试效率,值得收藏。

ByteShoal的博客 949

【Linux】nm命令:用于显示符号表信息的重要工具。它可以列出二进制文件中的符号,包括函数、全局变量和静态变量等

nm 是 GNU Binutils 工具集中用于显示符号表信息的重要工具。它可以列出二进制文件中的符号,包括函数、全局变量和静态变量等。本文将全面介绍 nm 命令的安装、基本使用方法及高级功能,并详细介绍 nm 的各种参数,帮助你掌握这一强大的符号表工具。

科技改变人类,技术成就未来 1004

linux下强大的ELF文件分析工具 -- nm

什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 目标文件:常说的目标文件是我们的程序文件(.c/.cpp,.h)经过预编译,编译,汇编过程生成的二进制文件,不经过链接过程,编译生成指令为: gcc(g++) -c file.c(file.cpp) 将生成对应的file.o文件,.

chenzhjlf的专栏 1150

linux下nm命令的使用

转载:http://www.mamicode.com/info-detail-2628679.html 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 目标文件 :常说的目...

倦鸟归时 3675

符号表与nm命令

摘要:本文深入解析符号表(Symbol Table)和nm命令在程序分析中的作用。符号表存储变量、函数等符号信息,nm命令可查看目标文件或可执行文件的符号。文章详细介绍了符号类型(如T/D/B/U)、nm命令用法(包括-C解码C++符号、-u查看未定义符号等),并通过C代码示例演示符号表生成过程。还探讨了符号表在链接、调试中的关键作用,以及高级用法如显示符号大小和源代码行号。最后提供了实际应用案例和跨平台注意事项,帮助开发者有效利用这些工具进行程序分析和问题排查。

always_TT的博客 323

linux下强大的文件分析工具 -- nm

什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 目标文件:常说的目标文件是我们的程序文件(.c/.cpp,.h)经过预编译,编译,汇编过程生成的二进制文件,不经过链接过程,编译生成指令为: gcc(g++) -c file.c(file.cpp) 将生成对应的file.o文件,.

木牛的博客 1788
上一篇: kermit的安装、配置、使用
下一篇: class_create(),device_create自动创建设备文件结点
batoom
博客等级 码龄20年 32粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值