ELF格式解析库之抽象数据类型

抽象?抽谁的象?

ELF是一种链接执行格式,它规定了对于一个ELF文件的基本数据类型是什么样的.可是,要解析一个ELF文件,而这个ELF文件或者是32Bits 或者是 64Bits,反正字长是未定的,怎么办?难道我们要定义两套解析的接口,以对应不同的字长的ELF文件吗?如果要这样做,不是不可以,只是那样做为接口的设计增加了太大的负担。这里我们采用“抽象”的方式,将已有的两套基础数据结构封装成一个兼容的数据结构。这样,我们设计解析接口时,可以做到尽量的简化,大大的减轻了工作量。

因此,这里的抽象数据类型,我们抽的是基础数据类型(在上一篇文章中已经给出)的象。

 

封     装

尽管我们要封装基础的数据类型,但是仍然遵照ELF格式的官方规定的数据组织格局。也就是说在ELF文件的一级数据组织管理上依然按照elfheader,section header,segment header,这样的结构来封装。

 

elf  header

   1:  /*the structure is common elf header struct for the interface user*/
   2:  typedef struct{
   3:     int         nFlag_Data;        /*system endding: 1 little endding, 2 big endding*/
   4:     int         nFlag_Bits;        /*bits system flag: 1    32bits, 2   64bits*/
   5:     SEF_ELFHEADER_32     S_ElfHeader_32;   /*suit 32bits platform*/
   6:     SEF_ELFHEADER_64     S_ElfHeader_64;   /*suit 64bits platform*/
   7:  } SEF_ELFHEADER;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

这里可以看到我们在抽象后的elfheader中设了两个标记值:nFlag_Data(大小端标记),nFlag_Bits(字长标记)。这样做的原因是,这两个值可以帮助我们快速确定ELF文件内部的数据字长和数据大小端,以便我们为数据开辟大小正确的缓冲区和校正字节序。

section header

   1:  /*the structure is common program header table struct for the interface user*/
   2:  typedef struct{
   3:      SEF_PROHEADER_32    *pS_ProHeader_32;
   4:      SEF_PROHEADER_64    *pS_ProHeader_64;
   5:  }    SEF_PROHEADER;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }这个是对于节头表的封装。

segment header

   1:  /*the structure is common section header table struct for the interface user*/
   2:  typedef struct{
   3:      char *    P_SecStrName;
   4:      SEF_SECHEADER_32    *pS_SecHeader_32;
   5:      SEF_SECHEADER_64    *pS_SecHeader_64;
   6:  }SEF_SECHEADER;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

这个是对于程序头表的封装。

最后给出头文件 adt.h

   1:  #ifndef _ADT_H
   2:  #define _ADT_H
   3:   
   4:  /*the structure is common elf header struct for the interface user*/
   5:  typedef struct{
   6:     int         nFlag_Data;        /*system endding: 1 little endding, 2 big endding*/
   7:     int         nFlag_Bits;        /*bits system flag: 1    32bits, 2   64bits*/
   8:     SEF_ELFHEADER_32     S_ElfHeader_32;   /*suit 32bits platform*/
   9:     SEF_ELFHEADER_64     S_ElfHeader_64;   /*suit 64bits platform*/
  10:  } SEF_ELFHEADER;
  11:   
  12:  /*the structure is common program header table struct for the interface user*/
  13:  typedef struct{
  14:      SEF_PROHEADER_32    *pS_ProHeader_32;
  15:      SEF_PROHEADER_64    *pS_ProHeader_64;
  16:  }    SEF_PROHEADER;
  17:   
  18:  /*the structure is common section header table struct for the interface user*/
  19:  typedef struct{
  20:      char *    P_SecStrName;
  21:      SEF_SECHEADER_32    *pS_SecHeader_32;
  22:      SEF_SECHEADER_64    *pS_SecHeader_64;
  23:  }SEF_SECHEADER;
  24:   
  25:   
  26:  typedef struct
  27:  {
  28:   
  29:      unsigned char *pBuffer;
  30:      SEF_ELFHEADER    *pS_ElfHeader;
  31:      SEF_PROHEADER    *pS_ProHeader;
  32:      SEF_SECHEADER    *pS_SecHeader;
  33:  }SEF_HEADSET;
  34:   
  35:  #endif

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

ELF格式解析库之抽象数据类型,布布扣,bubuko.com

时间: 2024-10-13 11:57:09

ELF格式解析库之抽象数据类型的相关文章

ELF格式解析库之基本数据类型

ELF格式简介 ELF是现代linux/unix流行的程序可执行链接格式,它有官方定义文档,具体的资料在Tool Interface Standard Executable and Linking Format Specification version 1.2 有其对应的详细描述.我在这里不会讲述关于这个格式详细描述,如果我叙述的有什么不对的地方,欢迎指正出来.当然一切都以官方的参考文档为标准,建议您在阅读本文的时候,手边最好有一份官方定义文档参考. ELF由三个头表描述:ELF header

ELF格式解析库之提取信息

看,宝藏就在那儿 在上一篇文章中,我们提到用按图索骥比喻库的初始化过程,那么现在有了地图,接下来的事情就是去寻找我们感兴趣的宝藏了.这个宝藏可能是一个ELF文件的程序文本段,也有可能是程序的某个不知名的代码段,这些都取决于你想要什么信息.我建议你去阅读ELF 的官方标准,那里边讲的比较清楚. 我这里只是实现了几个提取诸如:程序的大小端,能执行的CPU位数,程序的入口点,以及获得程序的所有节的编号和根据节的编号获取该节的详细信息. 提取信息:程序的大小端 1: long ELF_GetELFEnd

ELF格式解析库之初始化

寻宝要先设计路线图 对一个ELF文件来说,它里边装个一个程序的所有信息.我们想要拿的程序信息就在这个ELF文件的某个地址处.可是我们根本就不知道这个具体的地址是哪个,怎么办?举个较形象的例子来描述我们将要的做的事情.峨眉山的山道上放着一大箱金子,我们想搞到这箱黄金.所以在动手之前,我们应该先搞清楚这箱黄金具体位置在哪条山路上,然后设计出几条可行的路线图,接着才是沿着先前设计好的路线去找宝藏.只不过,在这里我们要找的黄金变成了程序某个部分的信息,而那座峨眉山则变成了一个ELF文件. 所以,寻宝要先

ELF格式的组成结构

LF指的是Executable and Linkable Format.最初是由UNIX系统实验室作为应用程序二进制接口开发和发行的,后来逐渐发展成为了可执行文件的格式标准,在很多操作系统和非操作系统环境中都有非常广泛的应用.完整的ELF格式标准涉及了三个方面的内容.在这里我们只需要关心一个方面,那就是一个ELF格式可执行程序的组成结构. 一个ELF可执行文件格式如图8-1所示. 像图8-1那样,一个ELF可执行文件包含了一个描述全局信息的ELF文件头.若干个Program头.若干个Segmen

Linux下的ELF可执行文件的格式解析 (转)

LInux命令只是和Kernel一起被编译进操作系统的存在于FS的ELF格式二进制文件,或者权限足够的脚本,或者一个软链 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用.可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统

ELF格式文件符号表全解析及readelf命令使用方法

http://blog.csdn.net/edonlii/article/details/8779075 1. 读取ELF文件头: $ readelf -h signELF Header:  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  Class:                                                  ELF64  Data:                            

ELF文件格式解析

1. ELF文件简介 首先,你需要知道的是所谓对象文件(Object files)有三个种类: 可重定位的对象文件(Relocatable file) 这是由汇编器汇编生成的 .o 文件.后面的链接器(link editor)拿一个或一些 Relocatable object files 作为输入,经链接处理后,生成一个可执行的对象文件 (Executable file) 或者一个可被共享的对象文件(Shared object file).我们可以使用 ar 工具将众多的 .o Relocata

【Python&数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

ELF格式的重定位原理分析

前面有篇文章分析了ELF格式,也只是让我们对目标文件有了一个大概的了解,并没有说明一个十分重要的问题:重定位,今天重新看了下重定位的资料,终于弄懂了重定位的过程,下面来做一个分析. 我们将使用下面两个源代码中的文件a.c和b.c展开分析: //a.c extern int shared; int main() { int a=100; swap(&a,&shared); } //b.c int shared=1; void swap(int *a,int *b) { *a^=*b^=*a^