博客搬家,原地址:https://langzi989.github.io/2017/12/03/Linux调试工具之readelf/

readelf命令可以用来查看elf格式文件的信息,与objdump相比,该工具显示的信息较为详细

elf文件

ELF(excutable and linking format)是一种对象文件格式,用于定义不同类型的对象文件中存放了那些东西,以及以什么格式存放。ELF文件可分为三种:

  • 可重定位对象文件(relocatable file)
  • 可执行对象文件(excutable file)
  • 可被共享的对象文件(shared object file)

可重定位对象文件

可重定位对象文件中包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。一般包括如汇编器汇编生成的.o文件

可执行文件

可执行文件是一个可执行文件,此文件规定了exec()如何创建一个程序的进程映像

可被共享的对象文件

可被共享的对象文件中包含可在两种上下文中链接的代码和数据。首先链接编辑器可将它与其他可重定位文件和目标文件和可共享目标文件一起处理,生成另外一个目标文件,其次,动态链接器可以将它与某个可执行文件以及其他可共享目标一起组合,创建进程映像。

readelf调试工具

readelf参数较多,可直接通过readelf -h获取readelf的所有参数及用法,此处只对其中的几个常用参数以及数据详解。

readelf -h

readelf -h参数的作用是读取指定elf文件的头信息。

$ readelf -h
ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              EXEC (Executable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x400800Start of program headers:          64 (bytes into file)Start of section headers:          7344 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         9Size of section headers:           64 (bytes)Number of section headers:         31Section header string table index: 28

重要参数解释:

  • Class : 该elf文件的类型,这里是64位的elf格式
  • Data : 该参数指明了文件中数据的组织方式是大端规则还是小端规则,此处为二进制存储的小端规则
  • OS/ABI : 生成该文件的操作系统类型,ABI(Application Binary Interface)
  • Type : 当前文件的类型,EXEC(可执行文件), REL(可重定位文件),DYN(可被共享文件)
  • Machine : 处理器类型
  • Entry point address : 程序的虚拟地址入口点,可执行文件之外的类型该值为0x0
  • Start of program headers : 程序头的开始处,从程序入口地址偏移地址开始。程序头table中记录elf文件中段的信息
  • Start of section headers : 段头的开始处,从程序入口地址偏移地址开始

readelf -s

readelf的作用是用来查看当前elf文件的符号表,符号表中的信息只包括全局变量和函数名
动态符号表(.synsym)用来保存与动态链接相关的导入导出符号,不包括模块内的符号;而sy,tab表则保存所有的符号,包括.dynsym中的符号。
动态符号表所包含的符号的符号名保存在动态符号字符串表.dynstr中。

如下所示程序:

#include <stdio.h>
//main.c
int g_data;
static int gs_data;void hello() {printf("hello world");
}int main() {static int a = 0;char l_data =0;hello();return 0;
}

将上述文件编译汇编成目标文件main.o文件,使用readelf -s main.o,结果如下:

Symbol table '.symtab' contains 15 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS main.cpp2: 0000000000000000     0 SECTION LOCAL  DEFAULT    13: 0000000000000000     0 SECTION LOCAL  DEFAULT    34: 0000000000000000     0 SECTION LOCAL  DEFAULT    45: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    4 _ZL7gs_data6: 0000000000000000     0 SECTION LOCAL  DEFAULT    57: 0000000000000008     4 OBJECT  LOCAL  DEFAULT    4 _ZZ4mainE7ls_data8: 0000000000000000     0 SECTION LOCAL  DEFAULT    79: 0000000000000000     0 SECTION LOCAL  DEFAULT    810: 0000000000000000     0 SECTION LOCAL  DEFAULT    611: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    4 g_data12: 0000000000000000    22 FUNC    GLOBAL DEFAULT    1 _Z5hellov13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf14: 0000000000000016    24 FUNC    GLOBAL DEFAULT    1 main

可以看出全局变量,静态全局变量,静态局部变量,全局函数名都会出现在符号表中,而局部变量不会被保存在符号表中。

Linux调试工具之readelf相关推荐

  1. Linux调试工具之readelf命令

    前言 在Linux中,通过gcc编译成的可执行文件的格式是ELF格式.通过readelf命令可以用来查看elf格式文件的信息. ELF文件类型 ELF文件有下面三种类型: 1.可重定位文件(目标文件) ...

  2. 【linux命令】readelf工具中英文说明

    简介 readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息. ELF文件由4部分组成,分别是ELF头(ELF header).程序头表(Program ...

  3. linux调试工具kdbg,Linux下图形化调试工具: kdbg, Affinic

    在linux下调试确实是个很麻烦的事, 用gdb调试不怎么方便, 没有在windows下用vs爽, 主要原因还是因为gdb是用命令行形式, 其实在linux下也有一些基于gdb的图形化调试工具. 1. ...

  4. 【学习点滴】linux调试工具、cmake和网络抓包

    目录 gdb 多进程调试 多线程调试: gdb底层原理 Linux下查看服务器端的并发连接个数: Valgrind memcheck strace Linux下,绑定1024以下的端口需要root权限 ...

  5. Linux ——objdump和readelf的使用

    在一个程序编译结束后,会生成****.o的文件,但往往当我们用vim命令查看这个文件内容时,就全是乱码, 像这样: 那么我们应该如何查看***.o文件呢? objdump和readelf的使用 obj ...

  6. ddd linux 调试工具_Ubuntu16.04下安装DDD(Data Display Debugger)

    前两天在Linux公社论坛偶然间看到了DDD这个软件,根据介绍是一个gdb界面化的调试软件,这正是我找了好长时间的东西,有一个有界面的调试工具了,于是乎今天抽了个时间整了整,里面碰到了不少坑,下面一一 ...

  7. php linux 调试工具,内网Visual Studio Code通过XDebug远程调试linux服务器PHP脚本

    开发环境是这样:一台位于内网环境下的Windows机器使用VSCode作为IDE编写 { "version": "0.2.0", "configura ...

  8. Linux调试工具strace和gdb常用命令小结-转

    Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是 ...

  9. Linux命令:readelf

    1 需求 关键参数: -h/--file-header    Display the ELF file header -l/--program-headers/--segments    Displa ...

  10. Linux下的readelf 指令和file指令

    1.readelf命令主要用于读取目标文件的信息: 例如: readelf -d a.out readelf -s lib/libql_data_wwan.so 查找libql_data_wwan.s ...

最新文章

  1. $(shell expr $(MAKE_VERSION) \= 3.81) 这里“\”的解释
  2. 2018.11.03-dtoj-3130-流浪者(rover)
  3. c++ map 析构函数_说说C++的虚析构函数
  4. BOOST_SCOPE_EXIT_TPL宏相关的测试程序
  5. 一个优秀的Push平台,需要经历怎样的前世今生
  6. P1092虫食算-深度优先搜索+玄学剪枝
  7. java tinyradius使用_TinyRadius客户端java登录认证
  8. 笑话生成器_爸爸笑话发生器
  9. jw player 6 断点续播 seek()
  10. 台式计算机主板,小白解惑-台式机电脑的主板是什么?该如何选购主板(1)
  11. 九九乘法表 - Java (矩形、正三角形、倒三角形)
  12. 从屡遭拒稿到90后助理教授,罗格斯大学王灏:好奇心驱使我不断探索
  13. docx文件转pdf,使用aspose words 转pdf,并且解决表格格式错乱
  14. bilibili有的视频没声音解决办法
  15. 模板文件如何调用php函数,模板文件调用方法与路径
  16. php处理微信weui图片上传
  17. 公众号题库系统接口-网课答案解析接口
  18. MySQL的二叉树、平衡二叉树、2,3查找树、B树、B+树索引
  19. SpringBoot与knif4j学习
  20. android端蓝牙控制单片机,android 蓝牙控制继电器——单片机控制端

热门文章

  1. 空间计量经济学(1)---空间计量简介与空间权重矩阵设置
  2. HEVC代码学习31:xCheckRDCostMerge2Nx2N函数
  3. 服务器内存检测维修工具,使用edac工具来检测服务器内存故障.
  4. 自动开关机软件哪个好?自动开关机软件盘点
  5. android 高音质 播放器,安卓音质最强音乐播放器—Rockbox
  6. python程序设计课程设计二级减速器_二级减速器课程设计
  7. 在Debian 11上创建软盘镜像分配给qemu虚拟机并使用
  8. 三星android10电话拦截功能,三星手机阻止来电怎么设置 拒接骚扰电话教程 - Iefans...
  9. WORD里边替换所有中文
  10. 201632位matlab下载_Matlab 2016a下载