about summary refs log tree commit diff stats
path: root/kernel.soso/elf.h
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-09-14 01:42:29 -0700
committerKartik Agaram <vc@akkartik.com>2019-09-14 01:45:55 -0700
commit46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546 (patch)
tree28918f653d7cf970d33d5592047ef663289aca40 /kernel.soso/elf.h
parentded2b24ce28f4a9df75ce40117f0f06f09574369 (diff)
downloadmu-46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546.tar.gz
5650 - support a second OS: soso
https://github.com/ozkl/soso

+ Much smaller than Linux; builds instantly
+ Supports graphics
- No network support
- Doesn't work on a cloud server (yet?)
Diffstat (limited to 'kernel.soso/elf.h')
-rw-r--r--kernel.soso/elf.h184
1 files changed, 184 insertions, 0 deletions
diff --git a/kernel.soso/elf.h b/kernel.soso/elf.h
new file mode 100644
index 00000000..984d6023
--- /dev/null
+++ b/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