about summary refs log tree commit diff stats
path: root/src/custommmap.c
diff options
context:
space:
mode:
authorRomain TISSERAND <romain.tisserand@gmail.com>2024-06-03 08:07:11 +0200
committerGitHub <noreply@github.com>2024-06-03 08:07:11 +0200
commit3d225ef9082fd4df12dd1c11ada54a3cd75b5132 (patch)
tree67e621b1b9ff15d873d86e487fd9b68b3bbbcca4 /src/custommmap.c
parent1c9123637a2464023615598773ac46c87711fda9 (diff)
downloadbox64-3d225ef9082fd4df12dd1c11ada54a3cd75b5132.tar.gz
box64-3d225ef9082fd4df12dd1c11ada54a3cd75b5132.zip
Try to fix mmap64 already defined error in custommem.c (#1552)
Diffstat (limited to 'src/custommmap.c')
-rw-r--r--src/custommmap.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/custommmap.c b/src/custommmap.c
new file mode 100644
index 00000000..93173098
--- /dev/null
+++ b/src/custommmap.c
@@ -0,0 +1,48 @@
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <unistd.h>
+#include <stdint.h>
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *) -1)
+#endif
+
+#define EXPORT __attribute__((visibility("default")))
+#ifdef BUILD_DYNAMIC
+#define EXPORTDYN __attribute__((visibility("default")))
+#else
+#define EXPORTDYN
+#endif
+
+typedef void x64emu_t;
+extern void* mapallmem;
+void setProtection(uintptr_t addr, size_t size, uint32_t prot);
+void freeProtection(uintptr_t addr, size_t size);
+void* internal_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
+int internal_munmap(void* addr, unsigned long length);
+
+void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
+
+extern int running32bits;
+extern int box64_mmap32;
+
+EXPORT void* mmap64(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset)
+{
+    void* ret;
+    if(!addr && ((running32bits && box64_mmap32) || (flags&0x40)))
+        ret = my_mmap64(NULL, addr, length, prot, flags | 0x40, fd, offset);
+    else
+        ret = internal_mmap(addr, length, prot, flags, fd, offset);
+    if(ret!=MAP_FAILED && mapallmem)
+        setProtection((uintptr_t)ret, length, prot);
+    return ret;
+}
+EXPORT void* mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset) __attribute__((alias("mmap64")));
+
+EXPORT int munmap(void* addr, unsigned long length)
+{
+    int ret = internal_munmap(addr, length);
+    if(!ret && mapallmem) {
+        freeProtection((uintptr_t)addr, length);
+    }
+    return ret;
+}