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 {
142 
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 }
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
Definition: stdio.c:315
int ftell(FILE *stream)
Текущая позиция считывания в файле
Definition: stdio.c:287
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
Definition: elf.h:87
Elf32_Addr e_entry
Точка входа в процесс
Definition: elf.h:92
Elf32_Half e_shnum
Количество записей в заголовке раздела
Definition: elf.h:100
Elf32_Half e_phnum
Количество записей заголовка программы
Definition: elf.h:98
Elf32_Half e_shstrndx
...
Definition: elf.h:101
Elf32_Half e_type
Тип объектного файла
Definition: elf.h:89
Elf32_Half e_shentsize
Размер записи заголовка раздела
Definition: elf.h:99
Elf32_Half e_mashine
Тип архитектуры
Definition: elf.h:90
Elf32_Half e_ehsize
Размер заголовка
Definition: elf.h:96
Elf32_Half e_phentsize
Размер записи заголовка программы
Definition: elf.h:97
Elf32_Off e_shoff
Смещение заголовка таблицы разделов
Definition: elf.h:94
Elf32_Off e_phoff
Смещение заголовка программы
Definition: elf.h:93
Elf32_Word e_version
Версия объектного файла
Definition: elf.h:91
Elf32_Word e_flags
Флаги, специфичные для процессора
Definition: elf.h:95
Elf32_Addr p_paddr
Физический адрес заголовка программы
Definition: elf.h:130
Elf32_Word p_type
Тип заголовка программы
Definition: elf.h:127
Elf32_Word p_flags
Флаги
Definition: elf.h:133
Elf32_Word p_filesz
Число байтов в сегменте файла
Definition: elf.h:131
Elf32_Word p_align
Отступ
Definition: elf.h:134
Elf32_Off p_offset
Смещение заголовка программы
Definition: elf.h:128
Elf32_Word p_memsz
...
Definition: elf.h:132
Elf32_Addr p_vaddr
Виртуальный адрес заголовка программы
Definition: elf.h:129
Elf32_Addr sh_addr
Виртуальный адрес раздела в образе процесса
Definition: elf.h:112
Elf32_Word sh_size
Размер раздела
Definition: elf.h:114
Elf32_Word sh_flags
Флаги атрибутов раздела
Definition: elf.h:111
Elf32_Word sh_type
Тип раздела
Definition: elf.h:110
Elf32_Word sh_info
Дополнительная информация
Definition: elf.h:116
Elf32_Off sh_offset
Смещение раздела в файле
Definition: elf.h:113
Elf32_Word sh_addralign
Добавление адреса раздела
Definition: elf.h:117
Elf32_Word sh_entsize
...
Definition: elf.h:118
Elf32_Word sh_link
...
Definition: elf.h:115
Elf32_Word sh_name
Указатель в таблице перемешивания заголовка раздела
Definition: elf.h:109
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
FILE * file
Ссылка на файл
Definition: elf.h:143
Elf32_Ehdr elf_header
ELF заголовок
Definition: elf.h:139
Elf32_Phdr * p_header
Программный заголовок
Definition: elf.h:141
Elf32_Shdr * section
Секции
Definition: elf.h:140