| @@ -121,6 +121,9 @@ static int rt_mem(TCCState *s1, int size) · 120 unmodified lines |
| 121 | 121 | ftruncate(fd, size); |
| 122 | 122 | |
| 123 | 123 | ptr = mmap(NULL, size * 2, PROT_READ|PROT_EXEC|(s1->do_debug ? PROT_WRITE : 0), MAP_SHARED, fd, 0); |
| 124 | + if (ptr == MAP_FAILED) |
| 125 | + /* Some targets do not support PROT_EXEC + PROT_WRITE */ |
| 126 | + ptr = mmap(NULL, size * 2, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); |
| 124 | 127 | /* mmap RW memory at fixed distance */ |
| 125 | 128 | prw = mmap((char*)ptr + size, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, 0); |
| 126 | 129 | close(fd); |
| @@ -356,13 +359,23 @@ redo: · 229 unmodified lines |
| 356 | 359 | if (copy == 3) |
| 357 | 360 | return 0; |
| 358 | 361 | |
| 362 | +#if defined TCC_TARGET_MACHO |
| 363 | + for (k = 0; k < 3; ++k) { /* 0:rx, 1:ro, 3:rw sections */ |
| 364 | +#else |
| 359 | 365 | for (k = 0; k < 4; ++k) { /* 0:rx, 1:ro, 2:ro debug , 3:rw sections */ |
| 366 | +#endif |
| 360 | 367 | n = 0; addr = 0; |
| 361 | 368 | for(i = 1; i < s1->nb_sections; i++) { |
| 369 | +#if defined TCC_TARGET_MACHO |
| 370 | + static const char shf[] = { |
| 371 | + SHF_ALLOC|SHF_EXECINSTR, SHF_ALLOC, SHF_ALLOC|SHF_WRITE |
| 372 | + }; |
| 373 | +#else |
| 362 | 374 | static const char shf[] = { |
| 363 | 375 | SHF_ALLOC|SHF_EXECINSTR, SHF_ALLOC, 0, SHF_ALLOC|SHF_WRITE |
| 364 | 376 | }; |
| 365 | 377 | if (k == 2 && s1->do_debug == 0) continue; |
| 378 | +#endif |
| 366 | 379 | s = s1->sections[i]; |
| 367 | 380 | if (shf[k] != (s->sh_flags & (SHF_ALLOC|SHF_WRITE|SHF_EXECINSTR))) |
| 368 | 381 | continue; |