20 elf_loader_reader_info_t m_reader_info;
21 elf_loader_reader_info_stdio_resultbuf_t m_resultbuf;
22} elf_loader_reader_info_stdio_t;
24static void *elf_loader_reader_read_elf_file_stdlib_allocation_callback(
25 void *userdata,
void *pointer, ptrdiff_t old_size, ptrdiff_t new_size)
36 new_ptr = realloc(pointer, new_size);
44static int elf_loader_reader_read_elf_file_stdio_read_callback(
45 void *userdata, elf_loader_reader_stage_t stage,
const elf_loader_reader_segment_info_t *segm_info,
size_t segm_count)
47 elf_loader_reader_info_stdio_t *procinfo;
50 procinfo = (elf_loader_reader_info_stdio_t *)userdata;
51 if ( !procinfo->m_fp )
53 for ( i = 0; i < segm_count; i += 1 )
55 if ( fseek(procinfo->m_fp, segm_info[i].m_segment_offset, SEEK_SET) )
59 if ( ftell(procinfo->m_fp) != segm_info[i].m_segment_offset )
63 if ( fread(segm_info[i].m_segment_addr, segm_info[i].m_segment_size, 1, procinfo->m_fp) != 1 )
72elf_loader_reader_read_elf_file_stdio_result_callback(
void *userdata,
void *pointer, ptrdiff_t pointer_size,
int errval)
74 elf_loader_reader_info_stdio_t *procinfo;
76 procinfo = (elf_loader_reader_info_stdio_t *)userdata;
77 procinfo->m_resultbuf.m_buf = pointer;
78 procinfo->m_resultbuf.m_bufsize = pointer_size;
79 procinfo->m_resultbuf.m_result = errval;
82int elf_loader_reader_read_elf_file_stdio(
83 elf_loader_reader_info_stdio_resultbuf_t *resultbuf,
const char *filename,
const char *flags)
85 elf_loader_reader_info_stdio_t procinfo;
87 procinfo.m_reader_info.m_userdata = &procinfo;
88 procinfo.m_reader_info.m_alloc_callback = elf_loader_reader_read_elf_file_stdlib_allocation_callback;
89 procinfo.m_reader_info.m_read_callback = elf_loader_reader_read_elf_file_stdio_read_callback;
90 procinfo.m_reader_info.m_result_callback = elf_loader_reader_read_elf_file_stdio_result_callback;
91 procinfo.m_fp = fopen(filename, flags);
94 elf_loader_reader_read_elf_file(&procinfo.m_reader_info);
97 fclose(procinfo.m_fp);
101 memcpy(resultbuf, &procinfo.m_resultbuf,
sizeof(elf_loader_reader_info_stdio_resultbuf_t));
102 return procinfo.m_resultbuf.m_result;