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