about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-09-23 19:54:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-09-23 19:54:52 +0200
commitb6bc7922b335fafb801ddf5238fd0c3e42084c52 (patch)
treeeabf1cf51bf3b1d566659bb78c13f815b623c659 /src
parent7e4af27ba761b2feb2ba444f85f7889b9de4c2a6 (diff)
downloadbox64-b6bc7922b335fafb801ddf5238fd0c3e42084c52.tar.gz
box64-b6bc7922b335fafb801ddf5238fd0c3e42084c52.zip
Fixed some elf loading issues (like Torchlight2)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 9ab2de18..2dbba828 100755
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -290,13 +290,17 @@ int LoadElfMemory(FILE* f, box64context_t* context, elfheader_t* head)
             Elf64_Phdr * e = &head->PHEntries[i];
             char* dest = (char*)e->p_paddr + head->delta;
             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);
+            void* p = (void*)-1;
+            if(e->p_memsz==e->p_filesz && !(e->p_align&0xfff)) {
+                printf_log(LOG_DEBUG, "MMap block #%zu @%p offset=%p (0x%zx/0x%zx, flags:0x%x)\n", i, dest, (void*)e->p_offset, e->p_filesz, e->p_memsz, e->p_flags);
+                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);
+                printf_log(LOG_DEBUG, "Loading block #%zu %p (0x%zx/0x%zx)\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);
+                        printf_log(LOG_NONE, "Fail to read PT_LOAD part #%zu (size=%zd)\n", i, e->p_filesz);
                         return 1;
                     }
                 }