about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-29 10:51:27 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-29 10:51:27 +0100
commit8e5a00db76c762c75b9c4f827d71919b07e5e967 (patch)
tree4cdee91014645ce573577c11650672dd650e6904 /src
parentfaaeffbd387623f9312613d6e45ff4fc6020ba72 (diff)
downloadbox64-8e5a00db76c762c75b9c4f827d71919b07e5e967.tar.gz
box64-8e5a00db76c762c75b9c4f827d71919b07e5e967.zip
[ELFLOADER] Use a fallback if allocated memory not at expected address for elf with vaddr
Diffstat (limited to 'src')
-rw-r--r--src/elfs/elfloader.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 45c7ce34..4c9221a5 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -203,19 +203,25 @@ int AllocLoadElfMemory(box64context_t* context, elfheader_t* head, int mainbin)
     #else   // PAGE4K
     // prereserve the whole elf image, without populating
     void* image = mmap64((void*)(head->vaddr?head->vaddr:offs), head->memsz, 0, MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0);
+    if(image!=MAP_FAILED && head->vaddr && image!=(void*)offs && (((uintptr_t)image)&max_align)) {
+        munmap(image, head->memsz);
+        image = mmap64(find47bitBlockElf(head->memsz, mainbin, max_align), head->memsz, 0, MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0);
+    }
     #endif
     if(image!=MAP_FAILED && !head->vaddr && image!=(void*)offs) {
         printf_log(LOG_INFO, "Mmap64 for (@%p 0x%zx) for elf \"%s\" returned %p instead\n", (void*)(head->vaddr?head->vaddr:offs), head->memsz, head->name, image);
         offs = (uintptr_t)image;
     }
     if(image==MAP_FAILED || image!=(void*)(head->vaddr?head->vaddr:offs)) {
-        printf_log(LOG_NONE, "Cannot create memory map (@%p 0x%zx) for elf \"%s\"", (void*)(head->vaddr?head->vaddr:offs), head->memsz, head->name);
+        printf_log(LOG_NONE, "%s cannot create memory map (@%p 0x%zx) for elf \"%s\"", (image==MAP_FAILED)?"Error:":"Warning:", (void*)(head->vaddr?head->vaddr:offs), head->memsz, head->name);
         if(image==MAP_FAILED) {
             printf_log(LOG_NONE, " error=%d/%s\n", errno, strerror(errno));
         } else {
             printf_log(LOG_NONE, " got %p\n", image);
         }
-        return 1;
+        if(image==MAP_FAILED)
+            return 1;
+        offs = (uintptr_t)image-head->vaddr;
     }
     printf_log(log_level, "Pre-allocated 0x%zx byte at %p for %s\n", head->memsz, image, head->name);
     head->delta = offs;