GitOS
Loading...
Searching...
No Matches
ELFFile.hpp
Go to the documentation of this file.
1//
2// Created by Pawel Reich on 12/22/24.
3//
4#pragma once
5
6#include <stddef.h>
7#include <stdint.h>
8
9class ELFFile
10{
11 public:
12 bool is_valid() const;
13 ELFFile(void* data, size_t size);
14
15 ~ELFFile();
16
17 int parse() const;
18 void* get_entry() const;
19
20 static constexpr char ELF_SIGNATURE[] = { 0x7f, 'E', 'L', 'F' };
21
22 static const unsigned int EI_NIDENT = 16;
23 static const unsigned int EI_CLASS = 4;
24 static const unsigned int EI_DATA = 5;
25 static const unsigned int SHN_UNDEF = 0;
26
28 {
29 PF_X = 0x1,
30 PF_W = 0x2,
31 PF_R = 0x4
32 };
33
34 enum p_type
35 {
43 };
44
60
61 enum e_type
62 {
64 ET_REL = 1,
66 ET_DYN = 3,
68 };
69
71 {
75 };
76
78 {
82 };
83
84 typedef uint16_t Elf32_Half;
85 typedef uint32_t Elf32_Word;
86 typedef int32_t Elf32_Sword;
87 typedef uint32_t Elf32_Addr;
88 typedef int32_t Elf32_Off;
89
90 typedef struct __attribute__((__packed__))
91 {
93 Elf32_Off p_offset;
94 Elf32_Addr p_vaddr;
95 Elf32_Addr p_paddr;
96 Elf32_Word p_filesz;
97 Elf32_Word p_memsz;
99 Elf32_Word p_align;
101
102 typedef struct __attribute__((__packed__))
103 {
104 Elf32_Word sh_name;
106 Elf32_Word sh_flags;
107 Elf32_Addr sh_addr;
108 Elf32_Off sh_offset;
109 Elf32_Word sh_size;
110 Elf32_Word sh_link;
111 Elf32_Word sh_info;
112 Elf32_Word sh_addralign;
113 Elf32_Word sh_entsize;
115
116 typedef struct __attribute__((__packed__))
117 {
118 unsigned char e_ident[EI_NIDENT];
120 Elf32_Half e_machine;
121 Elf32_Word e_version;
122 Elf32_Addr e_entry;
123 Elf32_Off e_phoff;
124 Elf32_Off e_shoff;
125 Elf32_Word e_flags;
126 Elf32_Half e_ehsize;
127 Elf32_Half e_phentsize;
128 Elf32_Half e_phnum;
129 Elf32_Half e_shentsize;
130 Elf32_Half e_shnum;
131 Elf32_Half e_shstrndx;
133
134 typedef struct __attribute__((__packed__))
135 {
136 Elf32_Sword d_tag;
137 union
138 {
139 Elf32_Word d_val;
140 Elf32_Addr d_ptr;
141 } d_un;
143
144 typedef struct __attribute__((__packed__))
145 {
146 Elf32_Word st_name;
147 Elf32_Addr st_value;
148 Elf32_Word st_size;
149 unsigned char st_info;
150 unsigned char st_other;
151 Elf32_Half st_shndx;
153
154 Elf32_Header* get_header() const;
155
157
158 Elf32_Phdr* get_program_header(unsigned int index) const;
159
161
162 Elf32_Shdr* get_section_header(unsigned int index) const;
163
164 const char* get_string_table() const;
165
166 private:
167 void* m_data;
168 size_t m_data_sz;
169};
ei_data
Definition ELFFile.hpp:78
@ ELFDATA2MSB
Definition ELFFile.hpp:81
@ ELFDATA2LSB
Definition ELFFile.hpp:80
@ ELFDATANONE
Definition ELFFile.hpp:79
e_type
Definition ELFFile.hpp:62
@ ET_NONE
Definition ELFFile.hpp:63
@ ET_REL
Definition ELFFile.hpp:64
@ ET_DYN
Definition ELFFile.hpp:66
@ ET_CORE
Definition ELFFile.hpp:67
@ ET_EXEC
Definition ELFFile.hpp:65
static constexpr char ELF_SIGNATURE[]
Definition ELFFile.hpp:20
Elf32_Header
Definition ELFFile.hpp:132
static const unsigned int EI_CLASS
Definition ELFFile.hpp:23
Elf32_Header * get_header() const
Definition ELFFile.cpp:64
int32_t Elf32_Off
Definition ELFFile.hpp:88
uint16_t Elf32_Half
Definition ELFFile.hpp:84
int32_t Elf32_Sword
Definition ELFFile.hpp:86
void * get_entry() const
Definition ELFFile.cpp:28
uint32_t Elf32_Addr
Definition ELFFile.hpp:87
Elf32_Shdr * get_section_header() const
Definition ELFFile.cpp:82
sh_type
Definition ELFFile.hpp:46
@ SHT_HASH
Definition ELFFile.hpp:52
@ SHT_RELA
Definition ELFFile.hpp:51
@ SHT_PROGBITS
Definition ELFFile.hpp:48
@ SHT_STRTAB
Definition ELFFile.hpp:50
@ SHT_REL
Definition ELFFile.hpp:56
@ SHT_NOTE
Definition ELFFile.hpp:54
@ SHT_SYMTAB
Definition ELFFile.hpp:49
@ SHT_NOBITS
Definition ELFFile.hpp:55
@ SHT_NULL
Definition ELFFile.hpp:47
@ SHT_DYNSYM
Definition ELFFile.hpp:58
@ SHT_SHLIB
Definition ELFFile.hpp:57
@ SHT_DYNAMIC
Definition ELFFile.hpp:53
static const unsigned int SHN_UNDEF
Definition ELFFile.hpp:25
Elf32_Shdr
Definition ELFFile.hpp:114
ELFFile(void *data, size_t size)
Definition ELFFile.cpp:17
const char * get_string_table() const
Definition ELFFile.cpp:93
Elf32_Phdr * get_program_header() const
Definition ELFFile.cpp:69
p_flags
Definition ELFFile.hpp:28
@ PF_R
Definition ELFFile.hpp:31
@ PF_X
Definition ELFFile.hpp:29
@ PF_W
Definition ELFFile.hpp:30
static const unsigned int EI_NIDENT
Definition ELFFile.hpp:22
static const unsigned int EI_DATA
Definition ELFFile.hpp:24
bool is_valid() const
Definition ELFFile.cpp:33
Elf32_Dyn
Definition ELFFile.hpp:142
Elf32_Phdr
Definition ELFFile.hpp:100
p_type
Definition ELFFile.hpp:35
@ PT_SHLIB
Definition ELFFile.hpp:41
@ PT_PHDR
Definition ELFFile.hpp:42
@ PT_NULL
Definition ELFFile.hpp:36
@ PT_DYNAMIC
Definition ELFFile.hpp:38
@ PT_NOTE
Definition ELFFile.hpp:40
@ PT_INTERP
Definition ELFFile.hpp:39
@ PT_LOAD
Definition ELFFile.hpp:37
Elf32_Sym
Definition ELFFile.hpp:152
struct __attribute__((__packed__))
Definition ELFFile.hpp:90
ei_class
Definition ELFFile.hpp:71
@ ELFCLASS64
Definition ELFFile.hpp:74
@ ELFCLASS32
Definition ELFFile.hpp:73
@ ELFCLASSNONE
Definition ELFFile.hpp:72
~ELFFile()
Definition ELFFile.cpp:23
int parse() const
Definition ELFFile.cpp:99
uint32_t Elf32_Word
Definition ELFFile.hpp:85
struct fat_directory __attribute__
uint16_t size
Definition gdt.h:0
uint8_t * data
Definition window.h:0