46bb1d3157
https://github.com/ozkl/soso + Much smaller than Linux; builds instantly + Supports graphics - No network support - Doesn't work on a cloud server (yet?)
185 lines
4.5 KiB
C
185 lines
4.5 KiB
C
#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
|