【Linux之·readelf工具·二进制程序处理工具】

2024-06-06 10:52

本文主要是介绍【Linux之·readelf工具·二进制程序处理工具】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录


文章目录

  • 前言
  • 一、使用readelf工具查看程序代码变量的内存空间布局情况
    • 1.1 源程序与程序的映射
    • 1.2 程序到进程的映射
  • 二、readelf指令
    • 2.1 节头信息
    • 2.2符号表段中的项
  • 总结


前言

  在现代软件开发中,了解和理解可执行文件和共享库的结构变得越来越重要。而readelf工具正是一个强大的工具,它能够帮助开发人员深入了解和分析可执行文件和共享库的结构和内容。通过readelf工具,我们可以获取有关文件的一些重要信息,如符号表、节区、动态链接等等。我们将从基础知识开始,介绍readelf工具的原理和功能。从而使读者能够更好地理解和分析可执行文件和共享库。无论是在调试、优化代码性能还是进行漏洞分析,掌握readelf工具都将为我们提供强大的工具和洞察力。


一、使用readelf工具查看程序代码变量的内存空间布局情况

1.1 源程序与程序的映射

描述
BSS段存放未初始化的全局变量或静态变量,Block Started by Symbol
DATA段存放已初始化的变量
TEXT段存放二进制代码

1.2 程序到进程的映射

描述
程序代码区存放函数体二进制代码
常量区存放常量、字符串等,只读
全局数据区存放全局变量、静态变量等,可读可写
堆区存放进程运行中被动态分配的内存段,可动态扩展或缩减
动态链接库用于在程序运行期间加载和卸载动态链接库
栈区存放函数的参数值局部变量的值等
#include<stdio.h>int v1;
int v2 = 0;
static int v3;
static int v4 = 4;int main(void)
{int v5;return 0;
}

v1、v2、v3都是未初始化的全局变量,所以在BSS段
v4为已初始化的全局变量,所以在DATA段
v5位局部变量,存储在栈(stack) 中。

注意: 未初始化的全局变量和静态变量以及被初始化为0的全局和静态变量

二、readelf指令

在Linux中,可以使用readelf指令来查看相应的信息。ELF(The Executable and Linking Format),是Linux的主要可执行文件格式,包含三种:

  • 可执行文件(.out)
  • 可重定位文件(.o)
  • 共享目标文件(.so)

readelf指令参数说明表:

指令描述
readelf -helf header,头文件信息
readelf -lprogram headers,显示程序头 (段头) 信息
readelf -Ssection headers,显示节头信息
readelf -ssymbols,显示符号表段中的项
readelf -rrelocs,显示可重定位段的信息
readelf -ddynamic,显示动态段的信息
readelf -Vversion-info,显示版本段的信息
readelf -Aarch-specific,显示CPU构架信息
readelf -Ihistogram,显示符号的时候,显示bucket list长度的柱状图
readelf -aall 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I

2.1 节头信息

There are 28 section headers, starting at offset 0x1950:节头:[] 名称              类型             地址              偏移量大小              全体大小          旗标   链接   信息   对齐
......[13] .text             PROGBITS         00000000000004f0  000004f00000000000000192  0000000000000000  AX       0     0     16
......[15] .rodata           PROGBITS         0000000000000690  000006900000000000000004  0000000000000004  AM       0     0     4
......[22] .data             PROGBITS         0000000000201000  000010000000000000000014  0000000000000000  WA       0     0     8[23] .bss              NOBITS           0000000000201014  000010140000000000000014  0000000000000000  WA       0     0     4

2.2符号表段中的项

   Num:    Value          Size Type    Bind   Vis      Ndx Name......34: 000000000020101c     4 OBJECT  LOCAL  DEFAULT   23 v335: 0000000000201010     4 OBJECT  LOCAL  DEFAULT   22 v4......51: 0000000000201020     4 OBJECT  GLOBAL DEFAULT   23 v1......64: 0000000000201018     4 OBJECT  GLOBAL DEFAULT   23 v2
#include<stdio.h>int v1;
int v2 = 0;
static int v3;
static int v4 = 4;int main(void)
{int v5;return 0;
}
  • v1: 未初始化变量,是一个GLOBAL符号,地址为0000000000201020,从Section Headers可以看到这个地址位于bss段;
  • v2: 初始化变量为0,是一个GLOBAL符号,地址为0000000000201018,从Section Headers可以看到这个地址位于bss段;
  • v3: 未初始化变量,但是被static修饰,所以为LOCAL,地址为000000000020101c,从Section Headers可以看到这个地址位于bss段;
  • v4: 初始化变量为非0,但是被static修饰,所以为LOCAL,地址为0000000000201010,从Section Headers可以看到这个地址位于data段。

总结

这篇关于【Linux之·readelf工具·二进制程序处理工具】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035903

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler