From e3552befe98122bce83fce85ed2816badeed65c0 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 12 Sep 2021 18:37:03 +0200 Subject: Try to use mmap first when loading elf file into memory --- src/elfs/elfloader.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 4f77d8f4..22977cc3 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -289,12 +289,16 @@ int LoadElfMemory(FILE* f, box64context_t* context, elfheader_t* head) if(head->PHEntries[i].p_type == PT_LOAD) { Elf64_Phdr * e = &head->PHEntries[i]; char* dest = (char*)e->p_paddr + head->delta; - printf_log(LOG_DEBUG, "Loading block #%zu @%p (0x%lx/0x%lx)\n", i, dest, e->p_filesz, e->p_memsz); - fseeko64(f, e->p_offset, SEEK_SET); - if(e->p_filesz) { - if(fread(dest, e->p_filesz, 1, f)!=1) { - printf_log(LOG_NONE, "Fail to read PT_LOAD part #%zu (size=%ld)\n", i, e->p_filesz); - return 1; + printf_log(LOG_DEBUG, "MMap block #%zu @%p offset=%p (0x%lx/0x%lx)\n", i, dest, (void*)e->p_offset, e->p_filesz, e->p_memsz); + void* p = mmap(dest, e->p_filesz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fileno(f), e->p_offset); + if(p!=dest) { + printf_log(LOG_DEBUG, "mmap failed(%p) => Loading block #%zu @%p (0x%lx/0x%lx)\n", p, i, dest, e->p_filesz, e->p_memsz); + fseeko64(f, e->p_offset, SEEK_SET); + if(e->p_filesz) { + if(fread(dest, e->p_filesz, 1, f)!=1) { + printf_log(LOG_NONE, "Fail to read PT_LOAD part #%zu (size=%ld)\n", i, e->p_filesz); + return 1; + } } } #ifdef DYNAREC -- cgit 1.4.1