Mercurial > pub > dyncall > dyncall
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)