feat: basic elf32 loader (only LOAD segment is supported)
[lunaix-os.git] / lunaix-os / includes / lunaix / elf.h
1 #ifndef __LUNAIX_ELF_H
2 #define __LUNAIX_ELF_H
3
4 #include <lunaix/types.h>
5
6 typedef unsigned int elf32_ptr_t;
7 typedef unsigned short elf32_hlf_t;
8 typedef unsigned int elf32_off_t;
9 typedef unsigned int elf32_swd_t;
10 typedef unsigned int elf32_wrd_t;
11
12 #define ET_NONE 0
13 #define ET_EXEC 2
14
15 #define PT_LOAD 1
16
17 #define PF_X 0x1
18 #define PF_W 0x2
19 #define PF_R 0x4
20
21 #define EM_NONE 0
22 #define EM_386 3
23
24 #define EV_CURRENT 1
25
26 #define ELFMAGIC 0x464c457fU
27 #define ELFCLASS32 1
28 #define ELFCLASS64 2
29 #define ELFDATA2LSB 1
30 #define ELFDATA2MSB 2
31
32 #define EI_CLASS 4
33 #define EI_DATA 5
34
35 struct elf32_ehdr
36 {
37     u8_t e_ident[16];
38     elf32_hlf_t e_type;
39     elf32_hlf_t e_machine;
40     elf32_wrd_t e_version;
41     elf32_ptr_t e_entry;
42     elf32_off_t e_phoff;
43     elf32_off_t e_shoff;
44     elf32_wrd_t e_flags;
45     elf32_hlf_t e_ehsize;
46     elf32_hlf_t e_phentsize;
47     elf32_hlf_t e_phnum;
48     elf32_hlf_t e_shentsize;
49     elf32_hlf_t e_shnum;
50     elf32_hlf_t e_shstrndx;
51 };
52
53 struct elf32_phdr
54 {
55     elf32_wrd_t p_type;
56     elf32_off_t p_offset;
57     elf32_ptr_t p_va;
58     elf32_ptr_t p_pa;
59     elf32_wrd_t p_filesz;
60     elf32_wrd_t p_memsz;
61     elf32_wrd_t p_flags;
62     elf32_wrd_t p_align;
63 };
64
65 #define SIZE_EHDR sizeof(struct elf32_ehdr)
66 #define SIZE_PHDR sizeof(struct elf32_phdr)
67
68 static inline int
69 elf_check_exec(struct elf32_ehdr* ehdr)
70 {
71     return (*(u32_t*)(ehdr->e_ident) == ELFMAGIC) ||
72            ehdr->e_ident[EI_CLASS] == ELFCLASS32 ||
73            ehdr->e_ident[EI_DATA] == ELFDATA2LSB || ehdr->e_type == ET_EXEC;
74 }
75 #endif /* __LUNAIX_ELF_H */