Play-/Source/ELF.h

260 lines
4.1 KiB
C
Raw Normal View History

2016-11-01 21:39:52 -04:00
#pragma once
2022-03-13 16:13:38 -04:00
#include <vector>
#include "Types.h"
#pragma pack(push, 1)
2022-03-13 16:13:38 -04:00
struct ELFSYMBOL32
{
2018-04-30 21:01:23 +01:00
uint32 nName;
uint32 nValue;
uint32 nSize;
uint8 nInfo;
uint8 nOther;
uint16 nSectionIndex;
};
2022-03-13 16:13:38 -04:00
struct ELFSYMBOL64
{
uint32 nName;
uint8 nInfo;
uint8 nOther;
uint16 nSectionIndex;
uint64 nValue;
uint64 nSize;
};
struct ELFHEADER32
{
2018-04-30 21:01:23 +01:00
uint8 nId[16];
uint16 nType;
uint16 nCPU;
uint32 nVersion;
uint32 nEntryPoint;
uint32 nProgHeaderStart;
uint32 nSectHeaderStart;
uint32 nFlags;
uint16 nSize;
uint16 nProgHeaderEntrySize;
uint16 nProgHeaderCount;
uint16 nSectHeaderEntrySize;
uint16 nSectHeaderCount;
uint16 nSectHeaderStringTableIndex;
};
2022-03-13 16:13:38 -04:00
struct ELFHEADER64
{
uint8 nId[16];
uint16 nType;
uint16 nCPU;
uint32 nVersion;
uint64 nEntryPoint;
uint64 nProgHeaderStart;
uint64 nSectHeaderStart;
uint32 nFlags;
uint16 nSize;
uint16 nProgHeaderEntrySize;
uint16 nProgHeaderCount;
uint16 nSectHeaderEntrySize;
uint16 nSectHeaderCount;
uint16 nSectHeaderStringTableIndex;
};
struct ELFSECTIONHEADER32
{
2018-04-30 21:01:23 +01:00
uint32 nStringTableIndex;
uint32 nType;
uint32 nFlags;
uint32 nStart;
uint32 nOffset;
uint32 nSize;
uint32 nIndex;
uint32 nInfo;
uint32 nAlignment;
uint32 nOther;
};
2022-03-13 16:13:38 -04:00
struct ELFSECTIONHEADER64
{
uint32 nStringTableIndex;
uint32 nType;
uint64 nFlags;
uint64 nStart;
uint64 nOffset;
uint64 nSize;
uint32 nIndex;
uint32 nInfo;
uint64 nAlignment;
uint64 nOther;
};
struct ELFPROGRAMHEADER32
{
2018-04-30 21:01:23 +01:00
uint32 nType;
uint32 nOffset;
uint32 nVAddress;
uint32 nPAddress;
uint32 nFileSize;
uint32 nMemorySize;
uint32 nFlags;
uint32 nAlignment;
};
2022-03-13 16:13:38 -04:00
struct ELFPROGRAMHEADER64
{
uint32 nType;
uint32 nFlags;
uint64 nOffset;
uint64 nVAddress;
uint64 nPAddress;
uint64 nFileSize;
uint64 nMemorySize;
uint64 nAlignment;
};
#pragma pack(pop)
class CELF
{
public:
2022-03-14 19:52:20 -04:00
typedef ELFHEADER32 HEADER;
typedef ELFPROGRAMHEADER32 PROGRAMHEADER;
typedef ELFSECTIONHEADER32 SECTIONHEADER;
typedef ELFSYMBOL32 ELFSYMBOL;
2022-03-12 10:49:17 -05:00
enum ELFHEADERID
{
EI_CLASS = 4,
EI_DATA = 5,
};
2022-03-10 17:33:28 -05:00
enum ELFCLASS
{
ELFCLASS32 = 1,
ELFCLASS64 = 2,
};
enum ELFDATA
{
ELFDATA2LSB = 1,
ELFDATA2MSB = 2,
};
enum EXECUTABLE_TYPE
{
2018-04-30 21:01:23 +01:00
ET_NONE = 0,
ET_REL = 1,
ET_EXEC = 2,
ET_DYN = 3,
ET_CORE = 4,
};
enum MACHINE_TYPE
{
2018-04-30 21:01:23 +01:00
EM_NONE = 0,
EM_M32 = 1,
EM_SPARC = 2,
EM_386 = 3,
EM_68K = 4,
EM_88K = 5,
EM_860 = 7,
EM_MIPS = 8,
2022-03-12 10:49:17 -05:00
EM_PPC64 = 21,
2018-04-30 21:01:23 +01:00
EM_ARM = 40,
};
enum EXECUTABLE_VERSION
{
2018-04-30 21:01:23 +01:00
EV_NONE = 0,
EV_CURRENT = 1,
};
enum SECTION_HEADER_TYPE
{
2018-04-30 21:01:23 +01:00
SHT_NULL = 0,
SHT_PROGBITS = 1,
SHT_SYMTAB = 2,
SHT_STRTAB = 3,
SHT_HASH = 5,
SHT_DYNAMIC = 6,
SHT_NOTE = 7,
SHT_NOBITS = 8,
SHT_REL = 9,
SHT_DYNSYM = 11,
};
2022-02-28 16:40:29 -05:00
enum SECTION_HEADER_FLAG
{
SHF_WRITE = 0x0001,
SHF_ALLOC = 0x0002,
SHF_EXECINSTR = 0x0004,
};
enum PROGRAM_HEADER_TYPE
{
2018-04-30 21:01:23 +01:00
PT_NULL = 0,
PT_LOAD = 1,
PT_DYNAMIC = 2,
PT_INTERP = 3,
PT_NOTE = 4,
PT_SHLIB = 5,
PT_PHDR = 6,
};
enum PROGRAM_HEADER_FLAG
{
2018-04-30 21:01:23 +01:00
PF_X = 0x01,
PF_W = 0x02,
PF_R = 0x04,
};
enum DYNAMIC_INFO_TYPE
{
2018-04-30 21:01:23 +01:00
DT_NONE = 0,
DT_NEEDED = 1,
DT_PLTRELSZ = 2,
DT_PLTGOT = 3,
DT_HASH = 4,
DT_STRTAB = 5,
DT_SYMTAB = 6,
DT_SONAME = 14,
DT_SYMBOLIC = 16,
};
enum MIPS_RELOCATION_TYPE
{
R_MIPS_32 = 2,
R_MIPS_26 = 4,
R_MIPS_HI16 = 5,
R_MIPS_LO16 = 6,
2018-04-25 10:55:52 -04:00
R_MIPS_GPREL16 = 7,
};
2018-04-30 21:01:23 +01:00
CELF(uint8*);
CELF(const CELF&) = delete;
2022-03-13 16:13:38 -04:00
virtual ~CELF() = default;
2018-04-30 21:01:23 +01:00
CELF& operator=(const CELF&) = delete;
2016-10-16 17:22:13 -04:00
2018-04-30 21:01:23 +01:00
uint8* GetContent() const;
2022-03-14 19:52:20 -04:00
const HEADER& GetHeader() const;
2022-03-14 19:52:20 -04:00
SECTIONHEADER* GetSection(unsigned int);
2018-04-30 21:01:23 +01:00
const void* GetSectionData(unsigned int);
const char* GetSectionName(unsigned int);
2022-03-14 19:52:20 -04:00
SECTIONHEADER* FindSection(const char*);
2018-04-30 21:01:23 +01:00
unsigned int FindSectionIndex(const char*);
const void* FindSectionData(const char*);
2022-03-14 19:52:20 -04:00
PROGRAMHEADER* GetProgram(unsigned int);
private:
2022-03-14 19:52:20 -04:00
HEADER m_header;
2018-04-30 21:01:23 +01:00
uint8* m_content = nullptr;
2022-03-14 19:52:20 -04:00
std::vector<SECTIONHEADER> m_sections;
std::vector<PROGRAMHEADER> m_programs;
};