zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/hellowolrd-dc/p/3887395.html
Copyright © 2011-2022 走看看