11#include "elf_loader_common.h"
19 ptrdiff_t cur_alloc_block_size;
22 cur_alloc_block_size = 0;
23 ptr =
info->m_alloc_callback(
33 cur_alloc_block_size =
35 elf_segment_info[0].m_segment_addr = ptr;
36 elf_segment_info[0].m_segment_offset = 0;
37 elf_segment_info[0].m_segment_size = cur_alloc_block_size;
39 if ( !
info->m_read_callback(
41 ELF_LOADER_READER_STAGE_ELF_HEADER,
43 sizeof(elf_segment_info) /
sizeof(elf_segment_info[0])) )
44 ptr =
info->m_alloc_callback(
info->m_userdata, ptr, cur_alloc_block_size, 0);
50 ret = elf_loader_is_elf_ehdr_valid(ptr);
52 ptr =
info->m_alloc_callback(
info->m_userdata, ptr, cur_alloc_block_size, 0);
61 elf_header = (
void *)ptr;
62 elf_header->e_shoff = 0;
63 elf_header->e_shentsize = 0;
64 elf_header->e_shnum = 0;
65 elf_header->e_shstrndx = 0;
66 phoff = elf_header->e_phoff;
69 elf_segment_info[0].m_segment_addr = ((u8 *)ptr) + elf_header->e_phoff;
70 elf_segment_info[0].m_segment_offset = phoff;
73 if ( !
info->m_read_callback(
75 ELF_LOADER_READER_STAGE_PROGRAM_HEADERS,
77 sizeof(elf_segment_info) /
sizeof(elf_segment_info[0])) )
78 ptr =
info->m_alloc_callback(
info->m_userdata, ptr, cur_alloc_block_size, 0);
88 elf_header = (
void *)ptr;
89 elf_pheader = (
void *)(((u8 *)ptr) + elf_header->e_phoff);
92 for ( i = 0; i < elf_header->e_phnum; i += 1 )
94 while ( i < elf_header->e_phnum && (elf_pheader[i].p_type != 1 || elf_pheader[i].p_filesz == 0) )
96 elf_header->e_phnum -= 1;
101 for ( i = 1; i < elf_header->e_phnum; i += 1 )
107 for ( j = i - 1; j >= 0 && phdr_tmp.p_vaddr < elf_pheader[j].p_vaddr; j -= 1 )
114 for ( i = 0; i < elf_header->e_phnum; i += 1 )
116 offs_sum += elf_pheader[i].p_filesz;
118 ptr =
info->m_alloc_callback(
info->m_userdata, ptr, cur_alloc_block_size, offs_sum);
119 cur_alloc_block_size = offs_sum;
130 elf_header = (
void *)ptr;
131 elf_pheader = (
void *)(((u8 *)ptr) + elf_header->e_phoff);
133 for ( i = 0; i < elf_header->e_phnum; i += 1 )
135 elf_segment_info[i].m_segment_addr = ((u8 *)ptr) + offs_sum;
136 elf_segment_info[i].m_segment_offset = elf_pheader[i].p_offset;
137 elf_segment_info[i].m_segment_size = elf_pheader[i].p_filesz;
138 elf_pheader[i].p_offset = offs_sum;
139 offs_sum += elf_segment_info[i].m_segment_size;
142 for ( i = 1; i < elf_header->e_phnum; i += 1 )
148 for ( j = i - 1; j >= 0 && segment_info_tmp.m_segment_offset < elf_segment_info[j].m_segment_offset; j -= 1 )
154 if ( !
info->m_read_callback(
155 info->m_userdata, ELF_LOADER_READER_STAGE_SEGMENTS, &elf_segment_info[0], elf_header->e_phnum) )
156 ptr =
info->m_alloc_callback(
info->m_userdata, ptr, cur_alloc_block_size, 0);
162 info->m_result_callback(
info->m_userdata, ptr, cur_alloc_block_size, ret);