56
57
"irrecoverable error"
60
static int elf_header_check(elf_header_t *);
59
61
static int segment_header(elf_segment_header_t *, elf_header_t *, as_t *,
61
63
static int section_header(elf_section_header_t *, elf_header_t *, as_t *);
73
75
unsigned int elf_load(elf_header_t *header, as_t *as, unsigned int flags)
79
rc = elf_header_check(header);
83
/* Check if the ELF image starts on a page boundary */
84
if (ALIGN_UP((uintptr_t) header, PAGE_SIZE) != (uintptr_t) header)
85
return EE_UNSUPPORTED;
87
/* Walk through all segment headers and process them. */
89
for (i = 0; i < header->e_phnum; i++) {
90
elf_segment_header_t *seghdr =
91
&((elf_segment_header_t *)(((uint8_t *) header) +
94
int rc = segment_header(seghdr, header, as, flags);
99
/* Inspect all section headers and proccess them. */
100
for (i = 0; i < header->e_shnum; i++) {
101
elf_section_header_t *sechdr =
102
&((elf_section_header_t *)(((uint8_t *) header) +
103
header->e_shoff))[i];
105
int rc = section_header(sechdr, header, as);
113
/** Get ELF image type.
115
* @param image Pointer to image
116
* @param etype Place to store type.
117
* @return EE_OK on success.
119
int elf_get_type(void *image, elf_type_t *etype)
121
elf_header_t *header;
124
header = (elf_header_t *) image;
126
rc = elf_header_check(header);
130
/* Walk through all segment headers. */
132
for (i = 0; i < header->e_phnum; i++) {
133
elf_segment_header_t *seghdr =
134
&((elf_segment_header_t *)(((uint8_t *) header) +
135
header->e_phoff))[i];
137
if (seghdr->p_type == PT_INTERP) {
138
/* TODO: Check interpreter string */
139
*etype = etype_loader;
148
/** Verify ELF header.
150
* @param header ELF header.
151
* @return EE_OK if valid.
153
static int elf_header_check(elf_header_t *header)
75
155
/* Identify ELF */
76
156
if ((header->e_ident[EI_MAG0] != ELFMAG0) ||
77
157
(header->e_ident[EI_MAG1] != ELFMAG1) ||
96
176
/* Check if the object type is supported. */
97
177
if (header->e_type != ET_EXEC)
98
178
return EE_UNSUPPORTED;
100
/* Check if the ELF image starts on a page boundary */
101
if (ALIGN_UP((uintptr_t) header, PAGE_SIZE) != (uintptr_t) header)
102
return EE_UNSUPPORTED;
104
/* Walk through all segment headers and process them. */
106
for (i = 0; i < header->e_phnum; i++) {
107
elf_segment_header_t *seghdr =
108
&((elf_segment_header_t *)(((uint8_t *) header) +
109
header->e_phoff))[i];
111
int rc = segment_header(seghdr, header, as, flags);
116
/* Inspect all section headers and proccess them. */
117
for (i = 0; i < header->e_shnum; i++) {
118
elf_section_header_t *sechdr =
119
&((elf_section_header_t *)(((uint8_t *) header) +
120
header->e_shoff))[i];
122
int rc = section_header(sechdr, header, as);