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

抽象?抽谁的象?

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

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

封     装

尽管我们要封装基础的数据类型,但是仍然遵照ELF格式的官方规定的数据组织格局。也就是说在ELF文件的一级数据组织管理上依然按照elfheadersection headersegment 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;

这里可以看到我们在抽象后的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;

这个是对于节头表的封装。

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;

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

最后给出头文件 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
原文地址:https://www.cnblogs.com/hellowolrd-dc/p/3887395.html