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