about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-09-12 18:37:03 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-09-12 18:37:03 +0200
commite3552befe98122bce83fce85ed2816badeed65c0 (patch)
tree98ea3f5ded5fd56c86e1e20134631eff43983797
parent6141421f92aa8a552ae612524ac67f3fa8c7eee8 (diff)
downloadbox64-e3552befe98122bce83fce85ed2816badeed65c0.tar.gz
box64-e3552befe98122bce83fce85ed2816badeed65c0.zip
Try to use mmap first when loading elf file into memory
-rwxr-xr-xsrc/elfs/elfloader.c16
1 files changed, 10 insertions, 6 deletions
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