changeset 255:704c28fd9428

- added "Unknown" type as executable format #define next to PE, Mach and ELF ones for cases like Minix < 3.2.0 - allow builds on platforms missing mprotect() (e.g. Minix)
author Tassilo Philipp
date Wed, 17 May 2017 02:39:41 +0200
parents 9d70178c1ded
children 7520e2260097
files autovar/autovar_ABI.h dyncallback/dyncall_alloc_wx_mmap.c
diffstat 2 files changed, 21 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/autovar/autovar_ABI.h	Mon May 15 13:06:04 2017 +0200
+++ b/autovar/autovar_ABI.h	Wed May 17 02:39:41 2017 +0200
@@ -32,13 +32,15 @@
 #define ABI_PE
 #elif defined(OS_Darwin)
 #define ABI_Mach
-#else
+#elif !defined(OS_Minix) || defined(__ELF__) /* Minix >= 3.2 (2012) uses ELF */
 #define ABI_ELF
 # if defined(__LP64__) || defined(_LP64)
 #   define ABI_ELF64
 # else
 #   define ABI_ELF32
 # endif
+#else
+#define ABI_Unknown
 #endif
 
 #endif /* AUTOVAR_ABI_H */
--- a/dyncallback/dyncall_alloc_wx_mmap.c	Mon May 15 13:06:04 2017 +0200
+++ b/dyncallback/dyncall_alloc_wx_mmap.c	Wed May 17 02:39:41 2017 +0200
@@ -40,6 +40,17 @@
 #  endif
 #endif
 
+/* platforms without mprotect */
+#if defined(DC__OS_Minix)
+#  define NO_MPROTECT
+#endif
+
+/* if no mprotect() available/wanted, make mmap alloc pages as rwx */
+#if defined(NO_MPROTECT)
+#  define MMAP_PROT_INIT (PROT_READ|PROT_WRITE|PROT_EXEC)
+#else
+#  define MMAP_PROT_INIT (PROT_READ|PROT_WRITE)
+#endif
 
 DCerror dcAllocWX(size_t size, void** pp)
 {
@@ -50,7 +61,7 @@
   int fd = open("/dev/zero", O_RDWR);
   if(fd == -1)
     return -1;
-  p = mmap(0, size+sizeof(int), PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+  p = mmap(0, size+sizeof(int), MMAP_PROT_INIT, MAP_PRIVATE, fd, 0);
   if(p == MAP_FAILED) {
     close(fd);
     return -1;
@@ -58,7 +69,7 @@
   *(int*)p = fd;
   p += sizeof(int);
 #else
-  p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+  p = mmap(0, size, MMAP_PROT_INIT, MAP_PRIVATE|MAP_ANON, -1, 0);
   if(p == MAP_FAILED)
     return -1;
 #endif
@@ -69,12 +80,17 @@
 
 DCerror dcInitExecWX(void* p, size_t size)
 {
+#if defined(NO_MPROTECT)
+  return 0;
+#else
+
 #if !defined(MAP_ANON) && defined(DC_UNIX)
   /* Fixup pointer for no-MAP_ANON workaround (see above) */
   p -= sizeof(int);
   size += sizeof(int);
 #endif
   return mprotect(p, size, PROT_READ|PROT_EXEC);
+#endif
 }
 
 void dcFreeWX(void* p, size_t size)