• 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
  • 相关阅读:
    3089:爬楼梯
    7592:求最大公约数问题
    JVM中内存回收深入分析,各种垃圾收集器
    PKU 1064 Cable master
    【面试&笔试】ASP.NET的相关问题
    1027. Colors in Mars (20) PAT
    DB_WRITER_PROCESSES与LOG_ARCHIVE_MAX_PROCESSES
    fedora下体验gentoo安装
    一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
    [置顶] export命令-linux
  • 原文地址:https://www.cnblogs.com/hellowolrd-dc/p/3887395.html
Copyright © 2020-2023  润新知