【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

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核