# HG changeset patch # User Tassilo Philipp # Date 1494981581 -7200 # Node ID 704c28fd94286f189be6e377de03981b9919879a # Parent 9d70178c1ded257fbe94ade72d4aebdb61f86714 - 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) diff -r 9d70178c1ded -r 704c28fd9428 autovar/autovar_ABI.h --- 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 */ diff -r 9d70178c1ded -r 704c28fd9428 dyncallback/dyncall_alloc_wx_mmap.c --- 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)