diff options
Diffstat (limited to 'tools/iso/kernel.soso/elf.h')
-rw-r--r-- | tools/iso/kernel.soso/elf.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/tools/iso/kernel.soso/elf.h b/tools/iso/kernel.soso/elf.h new file mode 100644 index 00000000..984d6023 --- /dev/null +++ b/tools/iso/kernel.soso/elf.h @@ -0,0 +1,184 @@ +#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 |