readelf nm objdump 命令详解

2023-10-26

讲解上面三条命令之前要先了解一下ELF格式文件https://blog.csdn.net/u014608280/article/details/81983055

一、readelf

 readelf命令可以查看ELF文件的详细信息。

选项

-a
--all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. 

-h
--file-header 显示elf文件开始的文件头信息. 

-l
--program-headers 
--segments 显示程序头(段头)信息(如果有的话)。 

-S
--section-headers 
--sections 显示节头信息(如果有的话)。 

-g
--section-groups 显示节组信息(如果有的话)。 

-t
--section-details 显示节的详细信息(-S的)。 

-s
--syms       
--symbols 显示符号表段中的项(如果有的话)。 

-e
--headers 显示全部头信息,等价于: -h -l -S 

-n
--notes 显示note段(内核注释)的信息。 

-r
--relocs 显示可重定位段的信息。 

-u
--unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。 

-d
--dynamic 显示动态段的信息。 

-V
--version-info 显示版本段的信息。 

-A
--arch-specific 显示CPU构架信息。 

-D
--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。 

-x <number or name>
--hex-dump=<number or name> 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名。 

-w[liaprmfFsoR] or
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。 

-I
--histogram 显示符号的时候,显示bucket list长度的柱状图。 

-v
--version 显示readelf的版本信息。 

-H
--help 显示readelf所支持的命令行选项。 

-W
--wide 宽行输出。 

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

查看ELF文件头信息

从输出结果我们可以得到:ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度及段数量等。

ELF文件中有很多各式各样的段,段表就是保存这些段的基本属性的结构。段表是ELF文件中除了文件头以外最重要的结构。

虽然用objdump -h 命令也可以查看ELF文件中包含的段,但是只能查看关键的段,其他辅助的段会省略掉。我们可以用readelf -S命令查看详细的段表结构。

对比一下

objdump -h 

.text(代码段) 、.data(数据段)、.bss是最基本的段,.rodata(只读数据段)、.comment(注释信息段)、.note.GNU-stack(堆栈提示段)。Name 为段名称、Size 是段的长度,File off 为段所在的位置。第二行表示段的各种属性CONTENTS表示改段在文件中存在。

这里提一下另外一个命令size,可以查看目标文件中主要段的大小

readelf -S

段表就是有11个元素的数组,Name为段名,Type为段的类型(详细见附表1),Address为段虚拟地址,Offset为段偏移,Size为段的长度,Entsize为Section Entry Size项的长度(有些段包含了一些固定大小的项,比如符号表,它包含的每个符号所占的大小都是一样的。对于这种段,Entsize表示每个项的大小),Flage为段的标志位(详细见附表2),Link和Info为段的连接信息,Align为段地址对齐。

ELF文件中还有一个重要的是符号表,用readelf -s 查看

Value为符号相对应的值,Size为符号的大小(对于包含数据的符号,即为该数据类型的大小),Type为符号类型(见符号类型表),Bind绑定信息(LOCAL 表示局部符号,对目标文件外部不可见;GLOBAL表示全局符号,外部可见;WEAK 表示弱引用),Ndx表示为符号所在的段(ABS表示该符号包含一个绝对值,COMMON 表示一般为为初始化的全局符号,UNDEF表示改符号未定义,在本目标文件中被引用但是定义在其他目标文件中)

 

二、objdump

objdump 查看目标文件或者可执行的目标文件

常用参数:

  • -f 显示文件头信息
  • -D 反汇编所有section (-d反汇编特定section)
  • -h 显示目标文件各个section的头部摘要信息
  • -x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -r -t 同时指定。
  • -i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
  • -r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。
  • -R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。
  • -s 将所有段的内容以十六进制的方式打印出来
  • -S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
  • -t 显示文件的符号表入口。类似于nm -s提供的信息

objdump  -d   查看每个段的汇编

输出太长只截取了一部分

objdump -t 查看符号信息

三、nm

nm -s   

 

输出符号含义说明:

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。
? 该符号类型没有定义

 

附表1 段的类型 

 

附表2 段的标志位

以及系统保留段的属性

2、符号类型表

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

readelf nm objdump 命令详解 的相关文章

  • 适合儿童学习的编程语言一览

    近两年我们常常会看到如下新闻 4 5岁的就能具备独立开发APP的能力 6 7岁的孩子甚至可以设计出可以上线的小游戏 在我们感慨小朋友们出色的编程能力的同时 不难发现编程已从边缘学科逐渐被大家重视 编程普及率不断提升 而且逐渐呈现出低龄化发展
  • 基于状态机的单个按键长按,短按实现复用

    开博第一文 希望再次记录学习的过程 按键扫描 单片机里面再基础不过的程序了 但对于初学者来说 用好按键也不是一件简单的事情 在毛老师的介绍下 第一次知道了状态机的思想也可以用于单片机的程序设计 感觉很是新奇 看了老师给发的几个文档后对状态机
  • HTML5编程简介及示例代码

    HTML5是一种用于构建网页和Web应用程序的标准 它引入了许多新的元素 属性和API 为开发者提供了更多的功能和灵活性 在本文中 我们将探讨HTML5编程的一些不同方面 并提供相应的示例代码 标题 Headings HTML5引入了新的标
  • 【网格问题】leetcode1020.飞地的数量

    题目 给你一个大小为 m x n 的二进制矩阵 grid 其中 0 表示一个海洋单元格 1 表示一个陆地单元格 一次 移动 是指从一个陆地单元格走到另一个相邻 上 下 左 右 的陆地单元格或跨过 grid 的边界 返回网格中 无法 在任意次
  • connect()函数

    connect 用于建立与指定socket的连接 头文件 include
  • 【Vue】从0-1全系列Vue教程带你启航!

    hello 我是小索奇 Vue js 已经备好文章 预更新哈 涵盖 Vue2 和 Vue3 涵盖代码示例 拓展内容 图解 疑难解答 让大家用最通俗的方式来学会 Vue 本系列会考虑到新手 会由浅入深 即使你是老玩家 也可以收藏备用 其中有很
  • Java 读取resources下的资源文件

    Web项目中应该经常有这样的需求 在maven项目的resources目录下放一些文件 比如一些配置文件 资源文件等 文件的读取方式有好几种方式 本文会对常用的读取方式做一个总结 并说明一下应该注意的地方 准备工作 新建一个spring t
  • socket连接超时问题

    一部分 把CSDN与中文yahoo翻了底朝天 也没找到如何设置socket的连接超时的满意方法 问此问题的兄弟已有一大堆 这里偶就讲一下win下如何设置socket的connect超时 设置connect的超时很简单 CSDN上也有人提到过
  • 一门新的编程语言ecere简介

    ecere 简称eC 是加拿大学者jerome历时十二年开发的一门编译型编程语言 拥有C 项目的性能 Java的跨平台性以及Python语法的简洁性 ecere在C语言的基础上加入了面向对象的支持 但与C Java相比 它更像是一个C语言的
  • 程序员水平分级

    导读 近日 whattofix com刊登了一篇 DanielMarkham的文章 What Level Programmer Are You 文内将参差不齐的程序员按照技术水平分为从 只读 到 上帝 共十一个阶段 以帮助广大程序员找到自身
  • 8个超实用的Python库合集,推一次火一次!

    Python 是一个很棒的语言 它是世界上发展最快的编程语言之一 它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性 整个 Python 及其库的生态系统使它成为全世界用户 初学者和高级用户 的合适选择 它的成功和流行的原
  • tcp/ip在物理层/数据链路层 实现简单抓包

    socket的精妙之处在于协议族的横向转换和地址族的纵向转换 我们也可在更底层实现对流经host的数据流的监督和修改 尤其是监察数据 十分简单 这里是混杂模式实现对ip数据流的监察与对tcp数据流的简单查看 需要root权限 这里忽略了tc
  • LabVIEW 读写和缩放音频文件

    LabVIEW 提供了多种方式来读取和写入 WAV 格式的音频文件 完成本模块后 您将能够使用位于 Programming Graphics Sound Sound Files 中的 Simple Read 和 Simple Write 用
  • GPIO_Speed_50MHz的值是多少

    在STM32底层库中 使用GPIO Speed 50MHz等来表示输出口的最高频率 那么他的值是多少 查看了一下定义 是个枚举 后来查了一下枚举才知道 当枚举中的某个元素备赋值后 从该元素往后是递增的 即1 2 3 当赋给指定的偏移地址后
  • 高效程序员的40个好习惯和行为方式

    每一个好的习惯 开头都会相应有一个唱反调的句子哦 1 做事 出了问题 第一重要的是确定元凶 找到那个人 一旦证实了是他的错误 就可以保证这样的问题永远也不会再发生了 指责不会修复bug 把矛头对准问题的解决办法 而不是人 这是真正有用处的正
  • 初学者怎么高效率学习c语言?

    想学C语言我们首先的了解C语言是什么 它是一门面向过程的 抽象化的通用程序设计语言 广泛应用于底层开发 C语言能以简易的方式编译以及处理低级存储器 C语言是仅产生少量的机器语言以及不需要任何运行环境支持就可以运行的高效率程序设计语言 尽管C
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • 各种汇编器masm masm32 fasm nasm yasm gas的区别

    原文地址 http www verydemo com demo c269 i661 html masm MASM是微软公司开发的汇编开发环境 拥有可视化的开发界面 使开发人员不必再使用DOS环境进行汇编的开发 编译速度快 支持80x86汇编
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • 8种Python字符串拼接的方法,你知道几种?

    一 join函数 join 是 python 中字符串自带的一个方法 返回一个字符串 使用语法为 将一个包含多个字符串的可迭代对象 字符串 元组 列表 转为用分隔符sep连接的字符串 列表 列表必须为非嵌套列表 列表元素为字符串 str 类

随机推荐

  • 打造属于自己的正则表达式

    概述 首先需要说明的一点 无论是Winform 还是Webform 都有很成熟的日历控件 无论从易用性还是可扩展性上看 日期的选择和校验还是用日历控件来实现比较好 前几天在CSDN多个版块看到需要日期正则的帖子 所以整理了这篇文章 和大家一
  • 【windows无法自动将IP协议堆栈绑定到网络适配器的一种解决办法】

    今天打开笔记本发现没网了 能够连上WiFi但无法连接到互联网 以太网能够检测到网线插入 但同样无法连接到互联网 使用windows自带的疑难解答进行检测结果为网络适配器的驱动程序可能出现问题 以管理员身份进行修复也失败 查看详情提示wind
  • linux命令之sh的用法

    shell简介 sh命令就是shell 而我们知道shell的作用是什么 shell就是用来解释linux命令的 我们输入命令 指示linux帮我们做什么 而linux本身是看不懂我们输入的命令的 它只认识01 而事实显然不是如此 那么在用
  • vcs import src < ros2.repos失败

    网上找到的ros安装教程 但是运行到下面几部的时候出现了问题 1 mkdir p ros2 ws src 2 cd ros2 ws 3 wget https raw githubusercontent com ros2 ros2 dashi
  • 大Sql文件使用cmd命令执行

    sqlcmd S 127 0 0 1 U sa P 123 d tcd test1217 i E fap sql 键入 sqlcmd S 127 0 0 1 U sa P 000000 d DataBaseName i sqlfileNam
  • 读书笔记 - Direct93D游戏程序设计入门

    这本书是directx入门很好的教材 门槛低 可以了解directx很多基本的东西 可以作为跳板 看完以后去学习更高级的东西 比如directx自带的sample 以前看过这本书 现在再看一遍 主要目的是熟悉dx基本绘制知识 书中主要包含到
  • 2012-04-26 14:42 PROFILE各种选项

    2012 04 26 14 42 PROFILE各种选项 1 用户创建语句选项 引发的血案 如果大家细心的话 在创建用户的语法中有这么一个选项 PROFILE profile 下面是 11gR2官方文档中关于创建用户的语法描述 较之的文档可
  • 漏洞补丁:漏洞命名(CVE和CNNVD)及补丁查找

    摘要 以前一个项目 最近收到一份脆弱性分析报告 漏洞报告 通过这份报告小技能 1 记录一下报告中几个重要编号说明和如何下载对应的补丁文件 一 名称介绍 截图为报告的部分内容 里面包含了编号 描述 解决地址 这里对 CVE编号 CVSS分值
  • redis集群的维护(redis-cli --cluster 命令用法)

    目录 前言 1 cluster create 创建集群 2 cluster check 检查集群 3 cluster info 查看集群 4 cluster fix 修复集群 5 cluster rehard 迁移槽位 6 cluster
  • Windows10下安装Carla及基本操作

    1 Carla介绍 一款用于自动驾驶研究的开源模拟器 2 安装依赖 首先我们需要确保电脑已安装Python3 X 在命令行中输入 pip install user pygame numpy 安装pygame和numpy模块 3 下载ZIP文
  • 回归预测

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 采用 DNN 深度神经网络作为模型训练架构 具体如图 3 所示 模型输入 将网络训练
  • WebAssembly学习(三)——初步读取本地文件

    WebAssembly学习 三 初步读取本地文件 在之前的学习记录里面 已经实现了简单的hello word打印 在这一步学习如何利用SDL库打印图案以及加载文件 原文参考Emscripten的官网 利用SDL库打印图案 SDL库 SDL是
  • 【动态规划】背包问题(详细总结,很全)

    动态规划 一 背包问题 1 背包问题总结 1 动规四部曲 2 递推公式总结 3 遍历顺序总结 2 01背包 1 二维dp数组 代码实现 2 一维dp数组 代码实现 3 完全背包 代码实现 4 多重背包 代码实现 一 背包问题 1 背包问题总
  • Docker查看容器挂载目录

    只显示Docker容器挂载目录信息 docker inspect format Config Volumes 369a1376f78c 显示Docker容器和物理主机挂载目录信息 方法一 docker inspect f Mounts 36
  • AttributeError: module ‘faiss‘ has no attribute ‘StandardGpuResources‘

    pip install faiss gpu pip install faiss cpu 若安装了GPU版本的Faiss 仍然报以下错误 module faiss has no attribute StandardGpuResources m
  • 自动化测试只会用工具就行?真不是这样

    软件测试是对项目研发过程的产物 文档 代码等 进行审查 保障产品质量的过程 我们可以通过手工测试 自动化测试 工具扫描等方法完成这个任务 其中 自动化测试是当前重要的一种测试方法 具有响应速度快 稳定性高 人工干预少的特点 很好地契合了高响
  • 使用docker安装分布式hadoop(阿里hadoop镜像)

    前面使用了docker自带的镜像安装 那么这篇使用阿里镜像搭建hadoop集群 也参考了网上部分播客 但是多多少少有问题 我这篇播客是全部经过实践测试成功跑起来的 1 安装hadoop镜像 1 拉取镜像 拉取阿里的hadoop镜像 dock
  • OpenGL的视图变换

    OpenGL的视图变换 OpenGL 中场景进行变换 要经历一些过程 视图变换 模型变换 投影变换 然后到了窗口坐标 这几个变换开始的时候把我搞很混 这几天整理一下 一般书上把这几个变换用照相机类比 其实每个变换都是产生着一个 4x4 矩阵
  • Android DataBinding错误记录

  • readelf nm objdump 命令详解

    讲解上面三条命令之前要先了解一下ELF格式文件https blog csdn net u014608280 article details 81983055 一 readelf readelf命令可以查看ELF文件的详细信息 选项 a al