diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-23 13:54:48 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-23 13:54:48 +0200 |
| commit | dd72a4542e9fee050b701f9230af8500ae7dbe91 (patch) | |
| tree | e72467064d78a5a4214cd1acc24d3c381197366f /src/elfs | |
| parent | 5fe0a68b46ab6e4d085f1676a8cdd5c749ca54d1 (diff) | |
| download | box64-dd72a4542e9fee050b701f9230af8500ae7dbe91.tar.gz box64-dd72a4542e9fee050b701f9230af8500ae7dbe91.zip | |
[BOX32][NON4K] Try to fix elfloader when elf wants to load at an address not-compatible with pagesize
Diffstat (limited to 'src/elfs')
| -rw-r--r-- | src/elfs/elfloader32.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/elfs/elfloader32.c b/src/elfs/elfloader32.c index 3b9ae080..ecb6d06c 100644 --- a/src/elfs/elfloader32.c +++ b/src/elfs/elfloader32.c @@ -158,6 +158,11 @@ int AllocLoadElfMemory32(box64context_t* context, elfheader_t* head, int mainbin image = (void*)(((uintptr_t)raw+max_align)&~max_align); } else { image = raw = mmap64(from_ptrv(head->vaddr), sz, 0, MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0); + if(from_ptr(head->vaddr)&(box64_pagesize-1)) { + // load address might be lower + if((uintptr_t)image == from_ptr(head->vaddr)&~(box64_pagesize-1)) + image = from_ptrv(head->vaddr); + } } if(image!=MAP_FAILED && !head->vaddr && image!=from_ptrv(offs)) { printf_log(LOG_INFO, "%s: Mmap64 for (@%p 0x%zx) for elf \"%s\" returned %p(%p/0x%zx) instead\n", (((uintptr_t)image)&max_align)?"Error":"Warning", from_ptrv(head->vaddr?head->vaddr:offs), head->memsz, head->name, image, raw, head->align); |