1
- #include " elf.h"
1
+ #include <core/ elf.h>
2
2
#include <core/logging.h>
3
3
#include <inttypes.h>
4
- #include <mmu/paging.h>
5
4
#include <string.h>
6
5
7
- int get_elf_type (elf_header_t * elf );
8
- void load_segment (uint8_t * data , elf_program_header_t * program_header );
6
+ #ifdef __x86_64__
7
+ #include <mmu/paging.h>
8
+ #endif
9
+
10
+ int elf_get_type (elf_header_t * elf );
11
+ void elf_load_segment (uint8_t * data , elf_program_header_t * program_header );
9
12
10
13
elf_header_t * elf_load (uint8_t * data )
11
14
{
12
15
elf_header_t * elf = (elf_header_t * )data ;
13
16
14
- if (get_elf_type (elf ) != ELF_TYPE_EXECUTABLE ) {
17
+ if (elf_get_type (elf ) != ELF_TYPE_EXECUTABLE ) {
15
18
CORE_DEBUG ("%s" , "not an executable" );
16
- return 0 ;
19
+ return NULL ;
17
20
}
18
21
19
22
CORE_DEBUG (
20
23
"file header: machine=%#x version=%#x type=%d entry=%p header_size=%u"
21
- " ph_size=%u ph_num=%d ph_offset=%" PRIu64 " sh_size=%u sh_num=%d"
22
- " sh_offset=%" PRIu64 " strtab_index=%d" ,
24
+ " ph_size=%u ph_num=%d sh_size=%u sh_num=%d strtab_index=%d" ,
23
25
elf -> machine ,
24
26
elf -> version ,
25
27
elf -> type ,
26
28
elf -> entry ,
27
29
elf -> header_size ,
28
30
elf -> ph_size ,
29
31
elf -> ph_num ,
30
- elf -> ph_offset ,
31
32
elf -> sh_size ,
32
33
elf -> sh_num ,
33
- elf -> sh_offset ,
34
34
elf -> strtab_index );
35
35
36
36
elf_program_header_t * program_header =
37
- (elf_program_header_t * )((uint64_t )data + elf -> ph_offset );
37
+ (elf_program_header_t * )((uintptr_t )data + elf -> ph_offset );
38
38
39
- for (uint64_t i = 0 ; i < elf -> ph_num ; i ++ ) {
40
- CORE_DEBUG ("program header: type=%d addr=%p" ,
39
+ for (uint16_t i = 0 ; i < elf -> ph_num ; i ++ ) {
40
+ CORE_DEBUG ("program header: type=%" PRIu32 " addr=%p" ,
41
41
program_header [i ].type ,
42
42
program_header [i ].virtual_address );
43
43
44
44
if (program_header [i ].type == ELF_PROGRAM_TYPE_LOAD ) {
45
- load_segment (data , & program_header [i ]);
45
+ elf_load_segment (data , & program_header [i ]);
46
46
}
47
47
}
48
48
@@ -51,7 +51,7 @@ elf_header_t* elf_load(uint8_t* data)
51
51
return elf ;
52
52
}
53
53
54
- int get_elf_type (elf_header_t * elf )
54
+ int elf_get_type (elf_header_t * elf )
55
55
{
56
56
int iself = -1 ;
57
57
@@ -64,7 +64,9 @@ int get_elf_type(elf_header_t* elf)
64
64
CORE_DEBUG ("%s" , "validating elf structs" );
65
65
66
66
if (elf -> header_size != sizeof (elf_header_t )) {
67
- CORE_DEBUG ("%s" , "invalid elf header size" );
67
+ CORE_DEBUG ("invalid elf header size: %d, expected: %d" ,
68
+ elf -> header_size ,
69
+ sizeof (elf_header_t ));
68
70
69
71
iself = -1 ;
70
72
} else if (elf -> ph_size != sizeof (elf_program_header_t )) {
@@ -81,13 +83,18 @@ int get_elf_type(elf_header_t* elf)
81
83
return iself ;
82
84
}
83
85
84
- void load_segment (uint8_t * data , elf_program_header_t * program_header )
86
+ void elf_load_segment (uint8_t * data , elf_program_header_t * program_header )
85
87
{
86
- uint64_t mem_size = program_header -> mem_size ; // Size in memory
87
- uint64_t file_size = program_header -> file_size ; // Size in file
88
- uint64_t addr = program_header -> virtual_address ; // Offset in memory
89
- uint64_t offset = program_header -> offset ; // Offset in file
88
+ ElfN_Size mem_size = program_header -> mem_size ; // Size in memory
89
+ ElfN_Size file_size = program_header -> file_size ; // Size in file
90
+ ElfN_Addr addr = program_header -> virtual_address ; // Address in memory
91
+ ElfN_Off offset = program_header -> offset ; // Offset in file
92
+
93
+ if (mem_size == 0 ) {
94
+ return ;
95
+ }
90
96
97
+ #ifdef __x86_64__
91
98
// We need WRITABLE because we copy data right after.
92
99
uint32_t flags =
93
100
PAGING_FLAG_PRESENT | PAGING_FLAG_USER_ACCESSIBLE | PAGING_FLAG_WRITABLE ;
@@ -102,11 +109,8 @@ void load_segment(uint8_t* data, elf_program_header_t* program_header)
102
109
uint64_t start_page = page_containing_address (addr );
103
110
uint32_t number_of_pages = paging_amount_for_byte_size (addr , mem_size );
104
111
105
- if (mem_size == 0 ) {
106
- return ;
107
- }
108
-
109
112
map_multiple (start_page , number_of_pages , flags );
113
+ #endif
110
114
111
115
memcpy ((void * )addr , data + offset , file_size );
112
116
memset ((void * )(addr + file_size ), 0 , mem_size - file_size );
@@ -118,21 +122,23 @@ void load_segment(uint8_t* data, elf_program_header_t* program_header)
118
122
void elf_unload (elf_header_t * elf )
119
123
{
120
124
elf_program_header_t * program_header =
121
- (elf_program_header_t * )((uint64_t )elf + elf -> ph_offset );
125
+ (elf_program_header_t * )((uintptr_t )elf + elf -> ph_offset );
122
126
123
- for (uint64_t i = 0 ; i < elf -> ph_num ; i ++ ) {
127
+ for (uint16_t i = 0 ; i < elf -> ph_num ; i ++ ) {
124
128
if (program_header [i ].type == ELF_PROGRAM_TYPE_LOAD ) {
125
- uint64_t mem_size = program_header [i ].mem_size ;
126
- uint64_t addr = program_header [i ].virtual_address ;
127
-
128
- uint64_t start_page = page_containing_address (addr );
129
- uint32_t number_of_pages = paging_amount_for_byte_size (addr , mem_size );
129
+ ElfN_Size mem_size = program_header [i ].mem_size ;
130
130
131
131
if (mem_size == 0 ) {
132
132
continue ;
133
133
}
134
134
135
+ #ifdef __x86_64__
136
+ uint64_t addr = program_header [i ].virtual_address ;
137
+ uint64_t start_page = page_containing_address (addr );
138
+ uint32_t number_of_pages = paging_amount_for_byte_size (addr , mem_size );
139
+
135
140
unmap_multiple (start_page , number_of_pages );
141
+ #endif
136
142
}
137
143
}
138
144
0 commit comments