opuntiaOS - an operating system targeting x86 and ARMv7
at master 182 lines 3.7 kB view raw
1/* 2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors. 3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com> 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9#ifndef _KERNEL_TASKING_ELF_H 10#define _KERNEL_TASKING_ELF_H 11 12#define ELF_CLASS_32 1 13#define ELF_CLASS_64 2 14 15#define ELF_DATA2_LSB 1 16#define ELF_DATA2_MSB 2 17 18enum E_IDENT_FIELDS { 19 EI_MAG0, 20 EI_MAG1, 21 EI_MAG2, 22 EI_MAG3, 23 EI_CLASS, 24 EI_DATA, 25 EI_VERSION, 26 EI_OSABI, 27 EI_ABIVERSION, 28}; 29 30enum E_TYPE_FIELDS { 31 ET_NONE, 32 ET_REL, 33 ET_EXEC, 34 ET_DYN, 35 ET_CORE, 36}; 37 38enum E_MACHINE_FIELDS { 39 EM_NONE = 0x0, 40 EM_386 = 0x03, 41 EM_ARM = 0x28, 42 EM_AMD64 = 0x32, 43}; 44 45typedef struct { 46 uint8_t e_ident[16]; 47 uint16_t e_type; 48 uint16_t e_machine; 49 uint32_t e_version; 50 uint32_t e_entry; 51 uint32_t e_phoff; 52 uint32_t e_shoff; 53 uint32_t e_flags; 54 uint16_t e_ehsize; 55 uint16_t e_phentsize; 56 uint16_t e_phnum; 57 uint16_t e_shentsize; 58 uint16_t e_shnum; 59 uint16_t e_shstrndx; 60} elf_header_32_t; 61 62enum P_TYPE_FIELDS { 63 PT_NULL, 64 PT_LOAD, 65 PT_DYNAMIC, 66 PT_INTERP, 67 PT_NOTE, 68 PT_SHLIB, 69 PT_PHDR, 70 PT_TLS, 71 PT_LOOS = 0x60000000, 72 PT_HIOS = 0x6FFFFFFF, 73 PT_LOPROC = 0x70000000, 74 PT_HIPROC = 0x7FFFFFFF, 75}; 76 77typedef struct { 78 uint32_t p_type; 79 uint32_t p_offset; 80 uint32_t p_vaddr; 81 uint32_t p_paddr; 82 uint32_t p_filesz; 83 uint32_t p_memsz; 84 uint32_t p_flags; 85 uint32_t p_align; 86} elf_program_header_32_t; 87 88enum SH_TYPE_FIELDS { 89 SHT_NULL, 90 SHT_PROGBITS, 91 SHT_SYMTAB, 92 SHT_STRTAB, 93 SHT_RELA, 94 SHT_HASH, 95 SHT_DYNAMIC, 96 SHT_NOTE, 97 SHT_NOBITS, 98 SHT_REL, 99 SHT_SHLIB, 100 SHT_DYNSYM, 101 SHT_INIT_ARRAY, 102 SHT_FINI_ARRAY, 103 SHT_PREINIT_ARRAY, 104 SHT_GROUP, 105 SHT_SYMTAB_SHNDX, 106 107 SHT_LOOS = 1610612736, 108 SHT_HIOS = 1879048191, 109 SHT_LOPROC = 1879048192, 110 SHT_HIPROC = 2147483647, 111 SHT_LOUSER = 2147483648, 112 SHT_HIUSER = 4294967295, 113}; 114 115enum SH_FLAGS_FIELDS { 116 SHF_WRITE = 0x1, 117 SHF_ALLOC = 0x2, 118 SHF_EXECINSTR = 0x4, 119 SHF_MERGE = 0x10, 120 SHF_STRINGS = 0x20, 121 122 SHF_INFO_LINK = 0x40, 123 SHF_LINK_ORDER = 0x80, 124 SHF_OS_NONCONFORMING = 0x100, 125 SHF_GROUP = 0x200, 126 SHF_TLS = 0x400, 127 SHF_COMPRESSED = 0x800, 128 SHF_MASKOS = 0x0ff00000, 129 SHF_MASKPROC = 0xf0000000 130}; 131 132typedef struct { 133 uint32_t sh_name; 134 uint32_t sh_type; 135 uint32_t sh_flags; 136 uint32_t sh_addr; 137 uint32_t sh_offset; 138 uint32_t sh_size; 139 uint32_t sh_link; 140 uint32_t sh_info; 141 uint32_t sh_addralign; 142 uint32_t sh_entsize; 143} elf_section_header_32_t; 144 145typedef struct { 146 uint32_t st_name; /* name - index into string table */ 147 uint32_t st_value; /* symbol value */ 148 uint32_t st_size; /* symbol size */ 149 unsigned char st_info; /* type and binding */ 150 unsigned char st_other; /* 0 - no defined meaning */ 151 uint16_t st_shndx; /* section header index */ 152} elf_sym_32_t; 153 154enum ST_BINDING_FIELDS { 155 STB_LOCAL = 0, 156 STB_GLOBAL = 1, 157 STB_WEAK = 2, 158 STB_NUM = 3, 159 STB_LOPROC = 13, 160 STB_HIPROC = 15 161}; 162 163enum ST_TYPE_FIELDS { 164 STT_NOTYPE = 0, 165 STT_OBJECT = 1, 166 STT_FUNC = 2, 167 STT_SECTION = 3, 168 STT_FILE = 4, 169 STT_TLS = 6, 170 STT_LOPROC = 13, 171 STT_HIPROC = 15 172}; 173 174struct proc; 175struct file_descriptor; 176 177int elf_check_header(elf_header_32_t* header); 178int elf_load(struct proc* p, struct file_descriptor* fd); 179int elf_find_symtab_unchecked(void* mapped_data, void** symtab, size_t* symtab_entries, char** strtab); 180ssize_t elf_find_function_in_symtab(void* symtab, size_t syms_n, uintptr_t ip); 181 182#endif // _KERNEL_TASKING_ELF_H