#ifndef ELF_H
#define ELF_H
#include "common.h"
/*
* ELF HEADER
*/
typedef struct {
unsigned char e_ident[16]; /* ELF identification */
uint16 e_type; /* 2 (exec file) */
uint16 e_machine; /* 3 (intel architecture) */
uint32 e_version; /* 1 */
uint32 e_entry; /* starting point */
uint32 e_phoff; /* program header table offset */
uint32 e_shoff; /* section header table offset */
uint32 e_flags; /* various flags */
uint16 e_ehsize; /* ELF header (this) size */
uint16 e_phentsize; /* program header table entry size */
uint16 e_phnum; /* number of entries */
uint16 e_shentsize; /* section header table entry size */
uint16 e_shnum; /* number of entries */
uint16 e_shstrndx; /* index of the section name string table */
} Elf32_Ehdr;
/*
* ELF identification
*/
#define EI_MAG0 0
#define EI_MAG1 1
#define EI_MAG2 2
#define EI_MAG3 3
#define EI_CLASS 4
#define EI_DATA 5
#define EI_VERSION 6
#define EI_PAD 7
/* EI_MAG */
#define ELFMAG0 0x7f
#define ELFMAG1 'E'
#define ELFMAG2 'L'
#define ELFMAG3 'F'
/* EI_CLASS */
#define ELFCLASSNONE 0 /* invalid class */
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
/* EI_DATA */
#define ELFDATANONE 0 /* invalide data encoding */
#define ELFDATA2LSB 1 /* least significant byte first (0x01020304 is 0x04 0x03 0x02 0x01) */
#define ELFDATA2MSB 2 /* most significant byte first (0x01020304 is 0x01 0x02 0x03 0x04) */
/* EI_VERSION */
#define EV_CURRENT 1
#define ELFVERSION EV_CURRENT
/*
* PROGRAM HEADER
*/
typedef struct {
uint32 p_type; /* type of segment */
uint32 p_offset;
uint32 p_vaddr;
uint32 p_paddr;
uint32 p_filesz;
uint32 p_memsz;
uint32 p_flags;
uint32 p_align;
} Elf32_Phdr;
/* p_type */
#define PT_NULL 0
#define PT_LOAD 1
#define PT_DYNAMIC 2
#define PT_INTERP 3
#define PT_NOTE 4
#define PT_SHLIB 5
#define PT_PHDR 6
#define PT_LOPROC 0x70000000
#define PT_HIPROC 0x7fffffff
/* p_flags */
#define PF_X 0x1
#define PF_W 0x2
#define PF_R 0x4
enum eElfSectionTypes {
SHT_NULL, //0
SHT_PROGBITS, //1
SHT_SYMTAB, //2
SHT_STRTAB, //3
SHT_RELA, //4
SHT_HASH, //5
SHT_DYNAMIC, //6
SHT_NOTE, //7
SHT_NOBITS, //8
SHT_REL, //9
SHT_SHLIB, //A
SHT_DYNSYM, //B
SHT_LAST, //C
SHT_LOPROC = 0x70000000,
SHT_HIPROC = 0x7fffffff,
SHT_LOUSER = 0x80000000,
SHT_HIUSER = 0xffffffff
};
typedef struct {
uint32 name;
uint32 type;
uint32 flags;
uint32 address;
uint32 offset;
uint32 size;
uint32 link;
uint32 info;
uint32 addralign;
uint32 entsize;
} Elf32_Scdr;
enum {
R_386_NONE=0, // none
R_386_32, // S+A
R_386_PC32, // S+A-P
R_386_GOT32, // G+A-P
R_386_PLT32, // L+A-P
R_386_COPY, // none
R_386_GLOB_DAT, // S
R_386_JMP_SLOT, // S
R_386_RELATIVE, // B+A
R_386_GOTOFF, // S+A-GOT
R_386_GOTPC, // GOT+A-P
R_386_LAST // none
};
typedef struct {
uint16 d_tag;
uint32 d_val; //Also d_ptr
} Elf32_dyn;
enum {
DT_NULL, //!< Marks End of list
DT_NEEDED, //!< Offset in strtab to needed library
DT_PLTRELSZ, //!< Size in bytes of PLT
DT_PLTGOT, //!< Address of PLT/GOT
DT_HASH, //!< Address of symbol hash table
DT_STRTAB, //!< String Table address
DT_SYMTAB, //!< Symbol Table address
DT_RELA, //!< Relocation table address
DT_RELASZ, //!< Size of relocation table
DT_RELAENT, //!< Size of entry in relocation table
DT_STRSZ, //!< Size of string table
DT_SYMENT, //!< Size of symbol table entry
DT_INIT, //!< Address of initialisation function
DT_FINI, //!< Address of termination function
DT_SONAME, //!< String table offset of so name
DT_RPATH, //!< String table offset of library path
DT_SYMBOLIC,//!< Reverse order of symbol searching for library, search libs first then executable
DT_REL, //!< Relocation Entries (Elf32_Rel instead of Elf32_Rela)
DT_RELSZ, //!< Size of above table (bytes)
DT_RELENT, //!< Size of entry in above table
DT_PLTREL, //!< Relocation entry of PLT
DT_DEBUG, //!< Debugging Entry - Unknown contents
DT_TEXTREL, //!< Indicates that modifcations to a non-writeable segment may occur
DT_JMPREL, //!< Address of PLT only relocation entries
DT_LOPROC = 0x70000000, //!< Low Definable
DT_HIPROC = 0x7FFFFFFF //!< High Definable
};
BOOL isElf(char *elfData);
uint32 loadElf(char *elfData);
#endif // ELF_H