I'm looking at OS X's man page on mmap. The EACCES does not seem to fit one of the stated reasons in the man page. Also see https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mmap.2.html.
I have two theories, both of which are guesses. Neither seems to be very good. First, this may be related to W^X pages on OS X. Second, the size is 0 but the wrong error code is returned. For the second case, size=0 should result in EINVAL. I don't know what size is so this is probably a bad guess. I'm not sure how to get this under a debugger. Here's a test of the first theory: % cat mmap-test.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> int main(int argc, char* argv[]) { size_t len = 10; int prot = PROT_EXEC | PROT_READ | PROT_WRITE; int flags = MAP_PRIVATE | MAP_ANONYMOUS; void *p = mmap (NULL, len, prot, flags, -1, 0); int err = errno; if (p) { printf("p is good\n"); munmap(p, len); } else { printf("p is bad (%d)\n", err); } return 0; } % clang -Wall mmap-test.c -o mmap-test.exe % ./mmap-test.exe p is good Here's a test of the second theory with len = 0: % ./mmap-test.exe p is good I'm out of ideas... ========================= This is the relevant part of libguile/jit.c: 1330 static struct code_arena * 1331 allocate_code_arena (size_t size, struct code_arena *prev) 1332 { 1333 struct code_arena *ret = malloc (sizeof (struct code_arena)); 1334 1335 if (!ret) return NULL; 1336 1337 memset (ret, 0, sizeof (*ret)); 1338 ret->used = 0; 1339 ret->size = size; 1340 ret->prev = prev; 1341 ret->base = mmap (NULL, ret->size, 1342 PROT_EXEC | PROT_READ | PROT_WRITE, 1343 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 1344 1345 if (ret->base == MAP_FAILED) 1346 { 1347 perror ("allocating JIT code buffer failed"); 1348 free (ret); 1349 return NULL; 1350 } 1351 1352 INFO ("allocated code arena, %p-%p\n", ret->base, ret->base + ret->size); 1353 1354 return ret; 1355 }