Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
elf.h
Go to the documentation of this file.
1#ifndef __LIBK_EXECUTABLE_ELF_H__
2#define __LIBK_EXECUTABLE_ELF_H__
3
4#include "libk/symbols.h"
5#include <type.h>
6#include <vector.h>
7
8#define EI_MAG0 0
9#define ELFMAG0 0x7f
10
11#define EI_MAG1 1
12#define ELFMAG1 'E'
13
14#define EI_MAG2 2
15#define ELFMAG2 'L'
16
17#define EI_MAG3 3
18#define ELFMAG3 'F'
19
20#define ELFMAG "\177ELF"
21
22typedef struct Elf64_Ehdr {
23 uint8_t e_ident[16]; /* ELF identification */
24 uint16_t e_type; /* Object file type */
25 uint16_t e_machine; /* Machine type */
26 uint32_t e_version; /* Object file version */
27 uint64_t e_entry; /* Entry point address */
28 uint64_t e_phoff; /* Program header offset */
29 uint64_t e_shoff; /* Section header offset */
30 uint32_t e_flags; /* Processor-specific flags */
31 uint16_t e_ehsize; /* ELF header size */
32 uint16_t e_phentsize; /* Size of program header entry */
33 uint16_t e_phnum; /* Number of program header entries */
34 uint16_t e_shentsize; /* Size of section header entry */
35 uint16_t e_shnum; /* Number of section header entries */
36 uint16_t e_shstrndx; /* Section name string table index */
38
39typedef struct Elf64_Phdr {
40 uint32_t p_type; /* Type of segment */
41 uint32_t p_flags; /* Segment attributes */
42 uint64_t p_offset; /* Offset in file */
43 uint64_t p_vaddr; /* Virtual address in memory */
44 uint64_t p_paddr; /* Reserved */
45 uint64_t p_filesz; /* Size of segment in file */
46 uint64_t p_memsz; /* Size of segment in memory */
47 uint64_t p_align; /* Alignment of segment */
49
50typedef struct Elf64_Shdr {
51 uint32_t sh_name; /* Section name */
52 uint32_t sh_type; /* Section type */
53 uint64_t sh_flags; /* Section attributes */
54 uint64_t sh_addr; /* Virtual address in memory */
55 uint64_t sh_offset; /* Offset in file */
56 uint64_t sh_size; /* Size of section */
57 uint32_t sh_link; /* Link to other section */
58 uint32_t sh_info; /* Miscellaneous information */
59 uint64_t sh_addralign; /* Address alignment boundary */
60 uint64_t sh_entsize; /* Size of entries, if section has table */
62
63typedef struct Elf64_Sym {
64 uint32_t st_name; /* Symbol name */
65 uint8_t st_info; /* Type and Binding attributes */
66 uint8_t st_other; /* Reserved */
67 uint16_t st_shndx; /* Section table index */
68 uint64_t st_value; /* Symbol value */
69 uint64_t st_size; /* Size of object (e.g., common) */
71
72typedef struct Elf64_Rel {
73 uint64_t r_offset; /* Address */
74 uint64_t r_info; /* Relocation type and symbol index */
76
77typedef struct Elf64_Rela {
78 uint64_t r_offset; /* Address */
79 uint64_t r_info; /* Relocation type and symbol index */
80 int64_t r_addend; /* Addend */
82
84 PT_NULL = 0, /* Unused entry */
85 PT_LOAD = 1, /* Loadable segment */
91 PT_TLS = 7,
92 PT_LOPROC = 0x70000000,
93 PT_HIPROC = 0x7fffffff
94};
95
97 SHF_WRITE = 0x1,
98 SHF_ALLOC = 0x2,
100 SHF_MERGE = 0x10,
105 SHF_GROUP = 0x200,
106 SHF_TLS = 0x400,
108 SHF_MASKOS = 0x0FF00000,
109 SHF_MASKPROC = 0xF0000000,
110 SHF_ORDERED = 0x4000000,
111 SHF_EXCLUDE = 0x8000000,
112};
113
156
176
177 SHT_GNU_ATTRIBUTES = 0x6ffffff5,
178 SHT_GNU_HASH = 0x6ffffff6,
179 SHT_GNU_LIBLIST = 0x6ffffff7,
180 SHT_CHECKSUM = 0x6ffffff8,
181 SHT_LOSUNW = 0x6ffffffa,
182 SHT_SUNW_move = 0x6ffffffa,
183 SHT_SUNW_COMDAT = 0x6ffffffb,
184 SHT_SUNW_syminfo = 0x6ffffffc,
185 SHT_GNU_verdef = 0x6ffffffd,
186 SHT_GNU_verneed = 0x6ffffffe,
187 SHT_GNU_versym = 0x6fffffff,
188
189 SHT_LOPROC = 0x70000000,
190 SHT_HIPROC = 0x7fffffff,
191
192 SHT_LOUSER = 0x80000000,
193 SHT_HIUSER = 0x8fffffff
194};
195
196typedef struct Elf64_Dyn {
197 uint64_t d_tag; /* Dynamic entry type */
198 union {
199 uint64_t d_val; /* Integer value */
200 uint64_t d_ptr; /* Address value */
203
211
257
258#define PF_X 0x1 // Execute
259#define PF_W 0x2 // Write
260#define PF_R 0x4 // Read
261
264
277
287
292
293// not needed , because already mapped by PT_LOAD
297
299
310
318
319size_t elf_load(volatile uintptr_t* page, uint8_t* data,
320 uintptr_t temporary_base, uintptr_t base,
321 struct elf_load_mmap_table* table);
322
324 Elf64_Sym* symtab, const char* strtab);
325void elf_gnu_hash_parse(GnuHashHeader* gnu_hash, Elf64_Shdr* gnu_hash_sym,
326 uint8_t* data);
327
329 uintptr_t user_base, GnuHashHeader* gnu_hash,
330 symbols_ptr_vector_t* external_syms,
331 struct elf_load_mmap_table* table, int table_count);
332
333void elf_get_symbol(const char* sym_name, uintptr_t base, elf_section_map* map,
335 boolean_t skip_empty_val);
336
337typedef void (*ctor_t)(void);
339uintptr_t elf_find_symbol(const char* name, GnuHashHeader* gnuhash,
342
343#define ELF64_R_SYM(i) ((i) >> 32)
344#define ELF64_R_TYPE(i) ((i) & 0xffffffffL)
345#define ELF64_R_INFO(s, t) (((Elf64_Xword)(s) << 32) + (Elf64_Xword)(t))
346#define ELF_PTR(type, base, off) \
347 ((type*)ASSUME_ALIGNED(PTR_ADD((base), (off)), alignof(type)))
348
351 int table_count);
352
354
355struct tcb {
356 void* self;
357};
358
359#endif
madt_record_table_entry_t table[]
Definition acpi.h:3
kstring name
Definition dentry.h:5
void elf_mmap_got(volatile uintptr_t *page, elf_section_map *map, uintptr_t base)
Definition elf.c:231
void(* ctor_t)(void)
Definition elf.h:337
uintptr_t elf_find_base_addr(uint8_t *data)
Definition elf.c:17
void elf_section_map_all(uint8_t *data, elf_section_map *map)
Definition elf.c:160
uint8_t * elf_dyn_find(Elf64_Dyn *dyn, uint8_t *data, uint64_t tag)
size_t elf_load(volatile uintptr_t *page, uint8_t *data, uintptr_t temporary_base, uintptr_t base, struct elf_load_mmap_table *table)
Definition elf.c:261
elf_section_map * map
Definition elf.h:295
uintptr_t elf_find_symbol(const char *name, GnuHashHeader *gnuhash, uintptr_t base, elf_section_map *map, uint8_t *data)
Definition elf.c:730
Elf_Shtag
Definition elf.h:157
@ SHT_GNU_verdef
Definition elf.h:185
@ SHT_HASH
Definition elf.h:163
@ SHT_GNU_LIBLIST
Definition elf.h:179
@ SHT_RELA
Definition elf.h:162
@ SHT_PROGBITS
Definition elf.h:159
@ SHT_SUNW_syminfo
Definition elf.h:184
@ SHT_STRTAB
Definition elf.h:161
@ SHT_SYMTAB_SHNDX
Definition elf.h:174
@ SHT_REL
Definition elf.h:167
@ SHT_LOSUNW
Definition elf.h:181
@ SHT_FINI_ARRAY
Definition elf.h:171
@ SHT_HIPROC
Definition elf.h:190
@ SHT_GNU_verneed
Definition elf.h:186
@ SHT_SUNW_move
Definition elf.h:182
@ SHT_GROUP
Definition elf.h:173
@ SHT_INIT_ARRAY
Definition elf.h:170
@ SHT_NOTE
Definition elf.h:165
@ SHT_GNU_HASH
Definition elf.h:178
@ SHT_SYMTAB
Definition elf.h:160
@ SHT_NOBITS
Definition elf.h:166
@ SHT_LOUSER
Definition elf.h:192
@ SHT_NULL
Definition elf.h:158
@ SHT_HIUSER
Definition elf.h:193
@ SHT_CHECKSUM
Definition elf.h:180
@ SHT_SUNW_COMDAT
Definition elf.h:183
@ SHT_DYNSYM
Definition elf.h:169
@ SHT_RELR
Definition elf.h:175
@ SHT_PREINIT_ARRAY
Definition elf.h:172
@ SHT_SHLIB
Definition elf.h:168
@ SHT_GNU_versym
Definition elf.h:187
@ SHT_LOPROC
Definition elf.h:189
@ SHT_DYNAMIC
Definition elf.h:164
@ SHT_GNU_ATTRIBUTES
Definition elf.h:177
Elf4_E_Type
Definition elf.h:204
@ ET_NONE
Definition elf.h:205
@ ET_REL
Definition elf.h:206
@ ET_DYN
Definition elf.h:208
@ ET_CORE
Definition elf.h:209
@ ET_EXEC
Definition elf.h:207
void elf_gnu_hash_parse(GnuHashHeader *gnu_hash, Elf64_Shdr *gnu_hash_sym, uint8_t *data)
Definition elf.c:604
Elf_Ptype
Definition elf.h:83
@ PT_LOPROC
Definition elf.h:92
@ PT_SHLIB
Definition elf.h:89
@ PT_PHDR
Definition elf.h:90
@ PT_TLS
Definition elf.h:91
@ PT_HIPROC
Definition elf.h:93
@ PT_NULL
Definition elf.h:84
@ PT_DYNAMIC
Definition elf.h:86
@ PT_NOTE
Definition elf.h:88
@ PT_INTERP
Definition elf.h:87
@ PT_LOAD
Definition elf.h:85
void elf_call_init_array(elf_section_map *map, uintptr_t base)
Definition elf.c:680
void elf_dyn_map_all(Elf64_Dyn *dyn, uint8_t *data, elf_dynamic_map *map)
Definition elf.c:60
uintptr_t elf_get_entry(uint8_t *data, uintptr_t base)
Definition elf.c:255
Elf64_Sym * elf_gnu_lookup(const char *name, GnuHashHeader *gh, Elf64_Sym *symtab, const char *strtab)
Definition elf.c:578
Elf64_Dyn * elf_get_phdr_dynamic(uint8_t *data)
Definition elf.c:45
void elf_call_init_array_with_table(elf_section_map *map, struct elf_load_mmap_table *table, int table_count)
Definition elf.c:699
void elf_relocate_dyn(elf_dynamic_map *map, uintptr_t kernel_base, uintptr_t user_base, GnuHashHeader *gnu_hash, symbols_ptr_vector_t *external_syms, struct elf_load_mmap_table *table, int table_count)
Definition elf.c:534
uint64_t elf_pflags_to_page_flags(uint64_t p_flags)
Definition elf.c:216
Elf_Dtag
Definition elf.h:114
@ DT_SYMENT
Definition elf.h:126
@ DT_FINI_ARRAYSZ
Definition elf.h:143
@ DT_SYMBOLIC
Definition elf.h:131
@ DT_PREINIT_ARRAYSZ
Definition elf.h:148
@ DT_NUM
Definition elf.h:150
@ DT_TEXTREL
Definition elf.h:137
@ DT_PLTRELSZ
Definition elf.h:117
@ DT_LOPROC
Definition elf.h:153
@ DT_RELASZ
Definition elf.h:123
@ DT_STRTAB
Definition elf.h:120
@ DT_HIPROC
Definition elf.h:154
@ DT_PLTREL
Definition elf.h:135
@ DT_RUNPATH
Definition elf.h:144
@ DT_RELSZ
Definition elf.h:133
@ DT_INIT
Definition elf.h:127
@ DT_RELAENT
Definition elf.h:124
@ DT_RELA
Definition elf.h:122
@ DT_NEEDED
Definition elf.h:116
@ DT_RPATH
Definition elf.h:130
@ DT_BIND_NOW
Definition elf.h:139
@ DT_NULL
Definition elf.h:115
@ DT_HIOS
Definition elf.h:152
@ DT_SYMTAB_SHNDX
Definition elf.h:149
@ DT_JMPREL
Definition elf.h:138
@ DT_PREINIT_ARRAY
Definition elf.h:147
@ DT_FINI_ARRAY
Definition elf.h:141
@ DT_RELENT
Definition elf.h:134
@ DT_REL
Definition elf.h:132
@ DT_PLTGOT
Definition elf.h:118
@ DT_HASH
Definition elf.h:119
@ DT_LOOS
Definition elf.h:151
@ DT_ENCODING
Definition elf.h:146
@ DT_INIT_ARRAYSZ
Definition elf.h:142
@ DT_DEBUG
Definition elf.h:136
@ DT_STRSZ
Definition elf.h:125
@ DT_SONAME
Definition elf.h:129
@ DT_FLAGS
Definition elf.h:145
@ DT_FINI
Definition elf.h:128
@ DT_SYMTAB
Definition elf.h:121
@ DT_INIT_ARRAY
Definition elf.h:140
Elf64_RelType
Definition elf.h:212
@ R_X86_64_SIZE32
Definition elf.h:247
@ R_X86_64_RELATIVE
Definition elf.h:221
@ R_X86_64_GLOB_DAT
Definition elf.h:219
@ R_X86_64_COPY
Definition elf.h:218
@ R_X86_64_GOTTPOFF
Definition elf.h:236
@ R_X86_64_32
Definition elf.h:223
@ R_X86_64_TPOFF32
Definition elf.h:237
@ R_X86_64_GOTOFF64
Definition elf.h:240
@ R_X86_64_IRELATIVE
Definition elf.h:253
@ R_X86_64_GOTPCREL
Definition elf.h:222
@ R_X86_64_RELATIVE64
Definition elf.h:255
@ R_X86_64_TLSGD
Definition elf.h:233
@ R_X86_64_64
Definition elf.h:214
@ R_X86_64_TLSDESC_CALL
Definition elf.h:250
@ R_X86_64_GOTPC32
Definition elf.h:241
@ R_X86_64_GOT64
Definition elf.h:242
@ R_X86_64_GOTPC32_TLSDESC
Definition elf.h:249
@ R_X86_64_DTPOFF64
Definition elf.h:231
@ R_X86_64_32S
Definition elf.h:224
@ R_X86_64_TPOFF64
Definition elf.h:232
@ R_X86_64_PC64
Definition elf.h:239
@ R_X86_64_GOT32
Definition elf.h:216
@ R_X86_64_PC16
Definition elf.h:226
@ R_X86_64_NONE
Definition elf.h:213
@ R_X86_64_GOTPLT64
Definition elf.h:245
@ R_X86_64_SIZE64
Definition elf.h:248
@ R_X86_64_GOTPC64
Definition elf.h:244
@ R_X86_64_TLSLD
Definition elf.h:234
@ R_X86_64_PC8
Definition elf.h:228
@ R_X86_64_JUMP_SLOT
Definition elf.h:220
@ R_X86_64_PC32
Definition elf.h:215
@ R_X86_64_8
Definition elf.h:227
@ R_X86_64_DTPOFF32
Definition elf.h:235
@ R_X86_64_DTPMOD64
Definition elf.h:230
@ R_X86_64_PLT32
Definition elf.h:217
@ R_X86_64_16
Definition elf.h:225
@ R_X86_64_TLSDESC
Definition elf.h:251
@ R_X86_64_PLTOFF64
Definition elf.h:246
@ R_X86_64_GOTPCREL64
Definition elf.h:243
void elf_get_symbol(const char *sym_name, uintptr_t base, elf_section_map *map, uint8_t *data, symbols_ptr_vector_t *syms, boolean_t skip_empty_val)
Definition elf.c:653
Elf_Shdr_Flags
Definition elf.h:96
@ SHF_MERGE
Definition elf.h:100
@ SHF_INFO_LINK
Definition elf.h:102
@ SHF_STRINGS
Definition elf.h:101
@ SHF_ALLOC
Definition elf.h:98
@ SHF_EXCLUDE
Definition elf.h:111
@ SHF_MASKPROC
Definition elf.h:109
@ SHF_COMPRESSED
Definition elf.h:107
@ SHF_GROUP
Definition elf.h:105
@ SHF_EXECINSTR
Definition elf.h:99
@ SHF_ORDERED
Definition elf.h:110
@ SHF_OS_NONCONFORMING
Definition elf.h:104
@ SHF_LINK_ORDER
Definition elf.h:103
@ SHF_TLS
Definition elf.h:106
@ SHF_WRITE
Definition elf.h:97
@ SHF_MASKOS
Definition elf.h:108
uintptr_t elf_count_load_size(uint8_t *data)
Definition elf.c:629
elf_section_map uintptr_t base
Definition elf.h:296
struct fs_data data
Definition filesystem.h:1
uintptr_t page
Definition paging.c:0
union Elf64_Dyn::@220367214354326365050217232242036207207371044375 d_un
uint64_t d_tag
Definition elf.h:197
uint64_t d_ptr
Definition elf.h:200
uint64_t d_val
Definition elf.h:199
uint64_t e_shoff
Definition elf.h:29
uint16_t e_type
Definition elf.h:24
uint16_t e_machine
Definition elf.h:25
uint32_t e_flags
Definition elf.h:30
uint8_t e_ident[16]
Definition elf.h:23
uint32_t e_version
Definition elf.h:26
uint16_t e_shnum
Definition elf.h:35
uint16_t e_phentsize
Definition elf.h:32
uint16_t e_shentsize
Definition elf.h:34
uint16_t e_phnum
Definition elf.h:33
uint64_t e_phoff
Definition elf.h:28
uint16_t e_ehsize
Definition elf.h:31
uint64_t e_entry
Definition elf.h:27
uint16_t e_shstrndx
Definition elf.h:36
uint64_t p_offset
Definition elf.h:42
uint64_t p_align
Definition elf.h:47
uint64_t p_memsz
Definition elf.h:46
uint32_t p_type
Definition elf.h:40
uint32_t p_flags
Definition elf.h:41
uint64_t p_filesz
Definition elf.h:45
uint64_t p_vaddr
Definition elf.h:43
uint64_t p_paddr
Definition elf.h:44
uint64_t r_info
Definition elf.h:74
uint64_t r_offset
Definition elf.h:73
uint64_t r_offset
Definition elf.h:78
uint64_t r_info
Definition elf.h:79
int64_t r_addend
Definition elf.h:80
uint64_t sh_flags
Definition elf.h:53
uint32_t sh_type
Definition elf.h:52
uint64_t sh_entsize
Definition elf.h:60
uint64_t sh_offset
Definition elf.h:55
uint32_t sh_info
Definition elf.h:58
uint64_t sh_addr
Definition elf.h:54
uint32_t sh_name
Definition elf.h:51
uint64_t sh_addralign
Definition elf.h:59
uint32_t sh_link
Definition elf.h:57
uint64_t sh_size
Definition elf.h:56
uint16_t st_shndx
Definition elf.h:67
uint8_t st_info
Definition elf.h:65
uint8_t st_other
Definition elf.h:66
uint64_t st_value
Definition elf.h:68
uint64_t st_size
Definition elf.h:69
uint32_t st_name
Definition elf.h:64
uint32_t bloom_size
Definition elf.h:303
uint32_t nbuckets
Definition elf.h:301
uint32_t * chains
Definition elf.h:308
uint32_t bloom_shift
Definition elf.h:304
uint32_t * buckets
Definition elf.h:307
uint32_t symoffset
Definition elf.h:302
uintptr_t * bloom
Definition elf.h:306
uint64_t pltrelsz
Definition elf.h:272
Elf64_Rela * rel
Definition elf.h:273
uint64_t relasz
Definition elf.h:274
uint64_t symcount
Definition elf.h:269
uint8_t * strtab
Definition elf.h:266
uint64_t relaent
Definition elf.h:275
Elf64_Sym * symbols
Definition elf.h:268
uint64_t pltgot
Definition elf.h:270
Elf64_Rela * jmprel
Definition elf.h:271
struct vector_uint64_t needed
Definition elf.h:267
uintptr_t paddr
Definition elf.h:314
uintptr_t vaddr
Definition elf.h:312
uintptr_t alligned
Definition elf.h:313
boolean_t mapped
Definition elf.h:316
Elf64_Shdr * gotplt
Definition elf.h:281
Elf64_Shdr * got
Definition elf.h:282
Elf64_Shdr * strtab
Definition elf.h:280
Elf64_Shdr * gnuhash
Definition elf.h:283
Elf64_Shdr * init_aray
Definition elf.h:284
Elf64_Shdr * symtab
Definition elf.h:279
Elf64_Shdr * fini_aray
Definition elf.h:285
Definition elf.h:355
void * self
Definition elf.h:356
struct vector_symbols_ptr symbols_ptr_vector_t
Definition symbols.h:20
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
uint8_t boolean_t
Definition type.h:89
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7
#define DEPRECATED
Definition type.h:96
signed long int64_t
Definition type.h:49
#define vector(T)
Definition vector.h:11
#define define_vector(T)
Definition vector.h:12