SayoriOS 0.3.3

elf.h
1 #pragma once
2
3 #include "mem/vmm.h"
4 #include "lib/stdio.h"
5
6 #define EI_NIDENT 16
7
8 /*-----------------------------------------------------------------------------
9 * Типы сейфы
10 *---------------------------------------------------------------------------*/
11 #define SHT_NULL 0
12 #define SHT_PROGBITS 1
13 #define SHT_SYMTAB 2
14 #define SHT_STRTAB 3
15 #define SHT_RELA 4
16 #define SHT_HASH 5
17 #define SHT_DYNAMIC 6
18 #define SHT_NOTE 7
19 #define SHT_NOBITS 8
20 #define SHT_REL 9
21 #define SHT_SHLIB 10
22 #define SHT_DYNSYM 11
23 #define SHT_LOPROC 0x70000000
24 #define SHT_HIPROC 0x7FFFFFFF
25 #define SHT_LOUSER 0x80000000
26 #define SHT_HIUSER 0xFFFFFFFF
27 #define SHF_WRITE 0x1
28 #define SHF_ALLOC 0x2
29 #define SHF_EXECINSTR 0x4
30 #define SHF_MASKPROC 0xF0000000
31
32 /*-----------------------------------------------------------------------------
33 * Типы файлов
34 *---------------------------------------------------------------------------*/
35 #define ET_NONE 0
36 #define ET_REL 1
37 #define ET_EXEC 2
38 #define ET_DYN 3
39 #define ET_CORE 4
40 #define ET_LOPROC 0xFF00
41 #define ET_HIPROC 0xFFFF
42
43 /*-----------------------------------------------------------------------------
44 * Типы архитектур
45 *---------------------------------------------------------------------------*/
46 #define EM_NONE 0
47 #define EM_M32 1
48 #define EM_SPARC 2
49 #define EM_386 3
50 #define EM_68K 4
51 #define EM_88K 5
52 #define EM_860 7
53 #define EM_MIPS 8
54
55 /*-----------------------------------------------------------------------------
56 *
57 *---------------------------------------------------------------------------*/
58 #define EV_NONE 0
59 #define EV_CURRENT 1
60
61 /*-----------------------------------------------------------------------------
62 *
63 *---------------------------------------------------------------------------*/
64 #define PT_NULL 0
65 #define PT_LOAD 1
66 #define PT_DYNAMIC 2
67 #define PT_INTERP 3
68 #define PT_NOTE 4
69 #define PT_SHLIB 5
70 #define PT_PHDR 6
71 #define PT_LOPROC 0x70000000
72 #define PT_HIPROC 0x7FFFFFFF
73
74 /*-----------------------------------------------------------------------------
75 * Типы данных
76 *---------------------------------------------------------------------------*/
77 typedef unsigned int Elf32_Addr;
78 typedef unsigned short int Elf32_Half;
79 typedef unsigned int Elf32_Off;
80 typedef int Elf32_Sword;
81 typedef unsigned int Elf32_Word;
82
83 /*-----------------------------------------------------------------------------
84 * Заголовки ELF
85 *---------------------------------------------------------------------------*/
86 typedef struct
87 {
88 unsigned char e_ident[EI_NIDENT];
89 Elf32_Half e_type;
90 Elf32_Half e_mashine;
91 Elf32_Word e_version;
92 Elf32_Addr e_entry;
93 Elf32_Off e_phoff;
94 Elf32_Off e_shoff;
95 Elf32_Word e_flags;
96 Elf32_Half e_ehsize;
97 Elf32_Half e_phentsize;
98 Elf32_Half e_phnum;
99 Elf32_Half e_shentsize;
100 Elf32_Half e_shnum;
101 Elf32_Half e_shstrndx;
102 } Elf32_Ehdr;
103
104 /*-----------------------------------------------------------------------------
105 * Заголовки секций
106 *---------------------------------------------------------------------------*/
107 typedef struct
108 {
109 Elf32_Word sh_name;
110 Elf32_Word sh_type;
111 Elf32_Word sh_flags;
112 Elf32_Addr sh_addr;
113 Elf32_Off sh_offset;
114 Elf32_Word sh_size;
115 Elf32_Word sh_link;
116 Elf32_Word sh_info;
117 Elf32_Word sh_addralign;
118 Elf32_Word sh_entsize;
119
120 } Elf32_Shdr;
121
122 /*-----------------------------------------------------------------------------
123 * Программный заголовок
124 *---------------------------------------------------------------------------*/
125 typedef struct
126 {
127 Elf32_Word p_type;
128 Elf32_Off p_offset;
129 Elf32_Addr p_vaddr;
130 Elf32_Addr p_paddr;
131 Elf32_Word p_filesz;
132 Elf32_Word p_memsz;
133 Elf32_Word p_flags;
134 Elf32_Word p_align;
135 } Elf32_Phdr;
136
137 typedef struct elf_sections
138 {
139 Elf32_Ehdr elf_header;
140 Elf32_Shdr* section;
141 Elf32_Phdr* p_header;
142
143 FILE* file;
144 } elf_t;
145
146 elf_t* load_elf(const char* name);
147 void unload_elf(elf_t* elf);
148 int32_t run_elf_file(const char *name, int argc, char* eargv[]);
149
150 static inline bool is_elf_file(FILE* fp) {
151 char* temp = kmalloc(4);
152 size_t orig = ftell(fp);
153
154 fseek(fp, 0, SEEK_SET);
155
156 // 7F 45 4C 46
157
158 fread(fp, 4, 1, temp);
159
160 fseek(fp, orig, SEEK_SET);
161
162 bool result = (temp[0] == 0x7F && temp[1] == 0x45 && temp[2] == 0x4C && temp[3] == 0x46);
163
164 kfree(temp);
165
166 return result;
167 }
fseek
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
Definition: stdio.c:315
ftell
int ftell(FILE *stream)
Текущая позиция считывания в файле
Definition: stdio.c:287
fread
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
Elf32_Ehdr
Definition: elf.h:87
Elf32_Ehdr::e_entry
Elf32_Addr e_entry
Точка входа в процесс
Definition: elf.h:92
Elf32_Ehdr::e_shnum
Elf32_Half e_shnum
Количество записей в заголовке раздела
Definition: elf.h:100
Elf32_Ehdr::e_phnum
Elf32_Half e_phnum
Количество записей заголовка программы
Definition: elf.h:98
Elf32_Ehdr::e_shstrndx
Elf32_Half e_shstrndx
...
Definition: elf.h:101
Elf32_Ehdr::e_type
Elf32_Half e_type
Тип объектного файла
Definition: elf.h:89
Elf32_Ehdr::e_shentsize
Elf32_Half e_shentsize
Размер записи заголовка раздела
Definition: elf.h:99
Elf32_Ehdr::e_mashine
Elf32_Half e_mashine
Тип архитектуры
Definition: elf.h:90
Elf32_Ehdr::e_ehsize
Elf32_Half e_ehsize
Размер заголовка
Definition: elf.h:96
Elf32_Ehdr::e_phentsize
Elf32_Half e_phentsize
Размер записи заголовка программы
Definition: elf.h:97
Elf32_Ehdr::e_shoff
Elf32_Off e_shoff
Смещение заголовка таблицы разделов
Definition: elf.h:94
Elf32_Ehdr::e_phoff
Elf32_Off e_phoff
Смещение заголовка программы
Definition: elf.h:93
Elf32_Ehdr::e_version
Elf32_Word e_version
Версия объектного файла
Definition: elf.h:91
Elf32_Ehdr::e_flags
Elf32_Word e_flags
Флаги, специфичные для процессора
Definition: elf.h:95
Elf32_Phdr
Definition: elf.h:126
Elf32_Phdr::p_paddr
Elf32_Addr p_paddr
Физический адрес заголовка программы
Definition: elf.h:130
Elf32_Phdr::p_type
Elf32_Word p_type
Тип заголовка программы
Definition: elf.h:127
Elf32_Phdr::p_flags
Elf32_Word p_flags
Флаги
Definition: elf.h:133
Elf32_Phdr::p_filesz
Elf32_Word p_filesz
Число байтов в сегменте файла
Definition: elf.h:131
Elf32_Phdr::p_align
Elf32_Word p_align
Отступ
Definition: elf.h:134
Elf32_Phdr::p_offset
Elf32_Off p_offset
Смещение заголовка программы
Definition: elf.h:128
Elf32_Phdr::p_memsz
Elf32_Word p_memsz
...
Definition: elf.h:132
Elf32_Phdr::p_vaddr
Elf32_Addr p_vaddr
Виртуальный адрес заголовка программы
Definition: elf.h:129
Elf32_Shdr
Definition: elf.h:108
Elf32_Shdr::sh_addr
Elf32_Addr sh_addr
Виртуальный адрес раздела в образе процесса
Definition: elf.h:112
Elf32_Shdr::sh_size
Elf32_Word sh_size
Размер раздела
Definition: elf.h:114
Elf32_Shdr::sh_flags
Elf32_Word sh_flags
Флаги атрибутов раздела
Definition: elf.h:111
Elf32_Shdr::sh_type
Elf32_Word sh_type
Тип раздела
Definition: elf.h:110
Elf32_Shdr::sh_info
Elf32_Word sh_info
Дополнительная информация
Definition: elf.h:116
Elf32_Shdr::sh_offset
Elf32_Off sh_offset
Смещение раздела в файле
Definition: elf.h:113
Elf32_Shdr::sh_addralign
Elf32_Word sh_addralign
Добавление адреса раздела
Definition: elf.h:117
Elf32_Shdr::sh_entsize
Elf32_Word sh_entsize
...
Definition: elf.h:118
Elf32_Shdr::sh_link
Elf32_Word sh_link
...
Definition: elf.h:115
Elf32_Shdr::sh_name
Elf32_Word sh_name
Указатель в таблице перемешивания заголовка раздела
Definition: elf.h:109
FILE
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
elf_sections
Definition: elf.h:138
elf_sections::file
FILE * file
Ссылка на файл
Definition: elf.h:143
elf_sections::elf_header
Elf32_Ehdr elf_header
ELF заголовок
Definition: elf.h:139
elf_sections::p_header
Elf32_Phdr * p_header
Программный заголовок
Definition: elf.h:141
elf_sections::section
Elf32_Shdr * section
Секции
Definition: elf.h:140