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