Unified · Split
| @@ -40,14 +40,20 @@ · 39 unmodified lines | ||
| 40 | 40 | #include <time.h> |
| 41 | 41 | #ifdef WIN32 |
| 42 | 42 | #include <sys/timeb.h> |
| 43 | +#include <windows.h> | |
| 43 | 44 | #endif |
| 44 | 45 | #ifndef WIN32 |
| 45 | 46 | #include <sys/time.h> |
| 46 | 47 | #include <sys/ucontext.h> |
| 48 | +#include <sys/mman.h> | |
| 47 | 49 | #endif |
| 48 | 50 | |
| 49 | 51 | #endif /* !CONFIG_TCCBOOT */ |
| 50 | 52 | |
| 53 | +#ifndef PAGESIZE | |
| 54 | +#define PAGESIZE 4096 | |
| 55 | +#endif | |
| 56 | + | |
| 51 | 57 | #include "elf.h" |
| 52 | 58 | #include "stab.h" |
| 53 | 59 | |
| @@ -199,7 +205,7 @@ typedef struct Section { · 145 unmodified lines | ||
| 199 | 205 | int sh_entsize; /* elf entry size */ |
| 200 | 206 | unsigned long sh_size; /* section size (only used during output) */ |
| 201 | 207 | unsigned long sh_addr; /* address at which the section is relocated */ |
| 202 | − unsigned long sh_offset; /* address at which the section is relocated */ | |
| 208 | + unsigned long sh_offset; /* file offset */ | |
| 203 | 209 | int nb_hashed_syms; /* used to resize the hash table */ |
| 204 | 210 | struct Section *link; /* link to another section */ |
| 205 | 211 | struct Section *reloc; /* corresponding section for relocation, if any */ |
| @@ -9615,6 +9621,30 @@ int tcc_relocate(TCCState *s1) · 9409 unmodified lines | ||
| 9615 | 9621 | if (s->reloc) |
| 9616 | 9622 | relocate_section(s1, s); |
| 9617 | 9623 | } |
| 9624 | + | |
| 9625 | + /* mark executable sections as executable in memory */ | |
| 9626 | + for(i = 1; i < s1->nb_sections; i++) { | |
| 9627 | + s = s1->sections[i]; | |
| 9628 | + if ((s->sh_flags & (SHF_ALLOC | SHF_EXECINSTR)) == | |
| 9629 | + (SHF_ALLOC | SHF_EXECINSTR)) { | |
| 9630 | +#ifdef WIN32 | |
| 9631 | + { | |
| 9632 | + DWORD old_protect; | |
| 9633 | + VirtualProtect(s->data, s->data_offset, | |
| 9634 | + PAGE_EXECUTE_READWRITE, &old_protect); | |
| 9635 | + } | |
| 9636 | +#else | |
| 9637 | + { | |
| 9638 | + unsigned long start, end; | |
| 9639 | + start = (unsigned long)(s->data) & ~(PAGESIZE - 1); | |
| 9640 | + end = (unsigned long)(s->data + s->data_offset); | |
| 9641 | + end = (end + PAGESIZE - 1) & ~(PAGESIZE - 1); | |
| 9642 | + mprotect((void *)start, end - start, | |
| 9643 | + PROT_READ | PROT_WRITE | PROT_EXEC); | |
| 9644 | + } | |
| 9645 | +#endif | |
| 9646 | + } | |
| 9647 | + } | |
| 9618 | 9648 | return 0; |
| 9619 | 9649 | } |
| 9620 | 9650 | |