1 #pragma once
2 
3 #include "Stream.h"
4 #include "Types.h"
5 
6 #pragma pack(push, 1)
7 
8 struct ELFSYMBOL
9 {
10 	uint32 nName;
11 	uint32 nValue;
12 	uint32 nSize;
13 	uint8 nInfo;
14 	uint8 nOther;
15 	uint16 nSectionIndex;
16 };
17 
18 struct ELFHEADER
19 {
20 	uint8 nId[16];
21 	uint16 nType;
22 	uint16 nCPU;
23 	uint32 nVersion;
24 	uint32 nEntryPoint;
25 	uint32 nProgHeaderStart;
26 	uint32 nSectHeaderStart;
27 	uint32 nFlags;
28 	uint16 nSize;
29 	uint16 nProgHeaderEntrySize;
30 	uint16 nProgHeaderCount;
31 	uint16 nSectHeaderEntrySize;
32 	uint16 nSectHeaderCount;
33 	uint16 nSectHeaderStringTableIndex;
34 };
35 
36 struct ELFSECTIONHEADER
37 {
38 	uint32 nStringTableIndex;
39 	uint32 nType;
40 	uint32 nFlags;
41 	uint32 nStart;
42 	uint32 nOffset;
43 	uint32 nSize;
44 	uint32 nIndex;
45 	uint32 nInfo;
46 	uint32 nAlignment;
47 	uint32 nOther;
48 };
49 
50 struct ELFPROGRAMHEADER
51 {
52 	uint32 nType;
53 	uint32 nOffset;
54 	uint32 nVAddress;
55 	uint32 nPAddress;
56 	uint32 nFileSize;
57 	uint32 nMemorySize;
58 	uint32 nFlags;
59 	uint32 nAlignment;
60 };
61 
62 #pragma pack(pop)
63 
64 class CELF
65 {
66 public:
67 	enum EXECUTABLE_TYPE
68 	{
69 		ET_NONE = 0,
70 		ET_REL = 1,
71 		ET_EXEC = 2,
72 		ET_DYN = 3,
73 		ET_CORE = 4,
74 	};
75 
76 	enum MACHINE_TYPE
77 	{
78 		EM_NONE = 0,
79 		EM_M32 = 1,
80 		EM_SPARC = 2,
81 		EM_386 = 3,
82 		EM_68K = 4,
83 		EM_88K = 5,
84 		EM_860 = 7,
85 		EM_MIPS = 8,
86 		EM_ARM = 40,
87 	};
88 
89 	enum EXECUTABLE_VERSION
90 	{
91 		EV_NONE = 0,
92 		EV_CURRENT = 1,
93 	};
94 
95 	enum SECTION_HEADER_TYPE
96 	{
97 		SHT_NULL = 0,
98 		SHT_PROGBITS = 1,
99 		SHT_SYMTAB = 2,
100 		SHT_STRTAB = 3,
101 		SHT_HASH = 5,
102 		SHT_DYNAMIC = 6,
103 		SHT_NOTE = 7,
104 		SHT_NOBITS = 8,
105 		SHT_REL = 9,
106 		SHT_DYNSYM = 11,
107 	};
108 
109 	enum PROGRAM_HEADER_TYPE
110 	{
111 		PT_NULL = 0,
112 		PT_LOAD = 1,
113 		PT_DYNAMIC = 2,
114 		PT_INTERP = 3,
115 		PT_NOTE = 4,
116 		PT_SHLIB = 5,
117 		PT_PHDR = 6,
118 	};
119 
120 	enum PROGRAM_HEADER_FLAG
121 	{
122 		PF_X = 0x01,
123 		PF_W = 0x02,
124 		PF_R = 0x04,
125 	};
126 
127 	enum DYNAMIC_INFO_TYPE
128 	{
129 		DT_NONE = 0,
130 		DT_NEEDED = 1,
131 		DT_PLTRELSZ = 2,
132 		DT_PLTGOT = 3,
133 		DT_HASH = 4,
134 		DT_STRTAB = 5,
135 		DT_SYMTAB = 6,
136 		DT_SONAME = 14,
137 		DT_SYMBOLIC = 16,
138 	};
139 
140 	enum MIPS_RELOCATION_TYPE
141 	{
142 		R_MIPS_32 = 2,
143 		R_MIPS_26 = 4,
144 		R_MIPS_HI16 = 5,
145 		R_MIPS_LO16 = 6,
146 		R_MIPS_GPREL16 = 7,
147 	};
148 
149 	CELF(uint8*);
150 	CELF(const CELF&) = delete;
151 	virtual ~CELF();
152 
153 	CELF& operator=(const CELF&) = delete;
154 
155 	uint8* GetContent() const;
156 	const ELFHEADER& GetHeader() const;
157 
158 	ELFSECTIONHEADER* GetSection(unsigned int);
159 	const void* GetSectionData(unsigned int);
160 	const char* GetSectionName(unsigned int);
161 
162 	ELFSECTIONHEADER* FindSection(const char*);
163 	unsigned int FindSectionIndex(const char*);
164 	const void* FindSectionData(const char*);
165 
166 	ELFPROGRAMHEADER* GetProgram(unsigned int);
167 
168 private:
169 	ELFHEADER m_Header;
170 	uint8* m_content = nullptr;
171 
172 	ELFSECTIONHEADER* m_pSection = nullptr;
173 	ELFPROGRAMHEADER* m_pProgram = nullptr;
174 };
175