GitOS
Operating system exercise
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
27 enum p_flags {
28 PF_X = 0x1,
29 PF_W = 0x2,
30 PF_R = 0x4
31 };
32
42
57
58 enum e_type {
60 ET_REL = 1,
62 ET_DYN = 3,
63 ET_CORE = 4
64 };
65
71
77
78 typedef uint16_t Elf32_Half;
79 typedef uint32_t Elf32_Word;
80 typedef int32_t Elf32_Sword;
81 typedef uint32_t Elf32_Addr;
82 typedef int32_t Elf32_Off;
83
84 typedef struct __attribute__((__packed__)) {
86 Elf32_Off p_offset;
87 Elf32_Addr p_vaddr;
88 Elf32_Addr p_paddr;
89 Elf32_Word p_filesz;
90 Elf32_Word p_memsz;
92 Elf32_Word p_align;
94
95 typedef struct __attribute__((__packed__)) {
96 Elf32_Word sh_name;
98 Elf32_Word sh_flags;
99 Elf32_Addr sh_addr;
100 Elf32_Off sh_offset;
101 Elf32_Word sh_size;
102 Elf32_Word sh_link;
103 Elf32_Word sh_info;
104 Elf32_Word sh_addralign;
105 Elf32_Word sh_entsize;
107
108 typedef struct __attribute__((__packed__)) {
109 unsigned char e_ident[EI_NIDENT];
111 Elf32_Half e_machine;
112 Elf32_Word e_version;
113 Elf32_Addr e_entry;
114 Elf32_Off e_phoff;
115 Elf32_Off e_shoff;
116 Elf32_Word e_flags;
117 Elf32_Half e_ehsize;
118 Elf32_Half e_phentsize;
119 Elf32_Half e_phnum;
120 Elf32_Half e_shentsize;
121 Elf32_Half e_shnum;
122 Elf32_Half e_shstrndx;
124
125 typedef struct __attribute__((__packed__)) {
126 Elf32_Sword d_tag;
127 union {
128 Elf32_Word d_val;
129 Elf32_Addr d_ptr;
130 } d_un;
132
133 typedef struct __attribute__((__packed__)) {
134 Elf32_Word st_name;
135 Elf32_Addr st_value;
136 Elf32_Word st_size;
137 unsigned char st_info;
138 unsigned char st_other;
139 Elf32_Half st_shndx;
141
142 Elf32_Header *get_header() const;
143
145
146 Elf32_Phdr *get_program_header(unsigned int index) const;
147
149
150 Elf32_Shdr *get_section_header(unsigned int index) const;
151
152 const char *get_string_table() const;
153
154 private:
155 void* m_data;
156 size_t m_data_sz;
157};
Definition ELFFile.hpp:9
ei_data
Definition ELFFile.hpp:72
@ ELFDATA2MSB
Definition ELFFile.hpp:75
@ ELFDATA2LSB
Definition ELFFile.hpp:74
@ ELFDATANONE
Definition ELFFile.hpp:73
e_type
Definition ELFFile.hpp:58
@ ET_NONE
Definition ELFFile.hpp:59
@ ET_REL
Definition ELFFile.hpp:60
@ ET_DYN
Definition ELFFile.hpp:62
@ ET_CORE
Definition ELFFile.hpp:63
@ ET_EXEC
Definition ELFFile.hpp:61
static constexpr char ELF_SIGNATURE[]
Definition ELFFile.hpp:20
Elf32_Header
Definition ELFFile.hpp:123
static const unsigned int EI_CLASS
Definition ELFFile.hpp:23
Elf32_Header * get_header() const
Definition ELFFile.cpp:59
int32_t Elf32_Off
Definition ELFFile.hpp:82
uint16_t Elf32_Half
Definition ELFFile.hpp:78
int32_t Elf32_Sword
Definition ELFFile.hpp:80
void * get_entry() const
Definition ELFFile.cpp:25
uint32_t Elf32_Addr
Definition ELFFile.hpp:81
Elf32_Shdr * get_section_header() const
Definition ELFFile.cpp:74
sh_type
Definition ELFFile.hpp:43
@ SHT_HASH
Definition ELFFile.hpp:49
@ SHT_RELA
Definition ELFFile.hpp:48
@ SHT_PROGBITS
Definition ELFFile.hpp:45
@ SHT_STRTAB
Definition ELFFile.hpp:47
@ SHT_REL
Definition ELFFile.hpp:53
@ SHT_NOTE
Definition ELFFile.hpp:51
@ SHT_SYMTAB
Definition ELFFile.hpp:46
@ SHT_NOBITS
Definition ELFFile.hpp:52
@ SHT_NULL
Definition ELFFile.hpp:44
@ SHT_DYNSYM
Definition ELFFile.hpp:55
@ SHT_SHLIB
Definition ELFFile.hpp:54
@ SHT_DYNAMIC
Definition ELFFile.hpp:50
static const unsigned int SHN_UNDEF
Definition ELFFile.hpp:25
Elf32_Shdr
Definition ELFFile.hpp:106
const char * get_string_table() const
Definition ELFFile.cpp:83
Elf32_Phdr * get_program_header() const
Definition ELFFile.cpp:63
p_flags
Definition ELFFile.hpp:27
@ PF_R
Definition ELFFile.hpp:30
@ PF_X
Definition ELFFile.hpp:28
@ PF_W
Definition ELFFile.hpp:29
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:29
Elf32_Dyn
Definition ELFFile.hpp:131
Elf32_Phdr
Definition ELFFile.hpp:93
p_type
Definition ELFFile.hpp:33
@ PT_SHLIB
Definition ELFFile.hpp:39
@ PT_PHDR
Definition ELFFile.hpp:40
@ PT_NULL
Definition ELFFile.hpp:34
@ PT_DYNAMIC
Definition ELFFile.hpp:36
@ PT_NOTE
Definition ELFFile.hpp:38
@ PT_INTERP
Definition ELFFile.hpp:37
@ PT_LOAD
Definition ELFFile.hpp:35
Elf32_Sym
Definition ELFFile.hpp:140
ei_class
Definition ELFFile.hpp:66
@ ELFCLASS64
Definition ELFFile.hpp:69
@ ELFCLASS32
Definition ELFFile.hpp:68
@ ELFCLASSNONE
Definition ELFFile.hpp:67
~ELFFile()
Definition ELFFile.cpp:21
int parse() const
Definition ELFFile.cpp:88
uint32_t Elf32_Word
Definition ELFFile.hpp:79
struct fat_directory __attribute__
uint16_t size
Definition gdt.h:0
uint8_t * data
Definition window.h:0