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