Mercurial > pub > dyncall > dyncall
diff dyncallback/dyncall_alloc_wx_mmap.c @ 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 | 047d2829bdf6 |
children | f5577f6bf97a |
line wrap: on
line diff
--- 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)