diff --git a/tccasm.c b/tccasm.c index 14f2e891..c8040ef6 100644 --- a/tccasm.c +++ b/tccasm.c @@ -818,8 +818,11 @@ static void asm_parse_directive(TCCState *s1, int global) tok1 = tok; next(); + if (tok < TOK_IDENT || tok >= SYM_FIRST_ANOM) + goto nolab; sym = asm_label_find(tok); if (!sym) { + nolab: tcc_error("label not found: %s", get_tok_str(tok1, NULL)); } /* XXX .size name,label2-label1 */ diff --git a/tccelf.c b/tccelf.c index 4069d349..6b671c56 100644 --- a/tccelf.c +++ b/tccelf.c @@ -2615,6 +2615,10 @@ static int tcc_output_elf(TCCState *s1, FILE *f, int phnum, ElfW(Phdr) *phdr) #if TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD; +#elif TARGETOS_OpenBSD + ehdr.e_ident[EI_OSABI] = ELFOSABI_OPENBSD; +#elif TARGETOS_NetBSD + ehdr.e_ident[EI_OSABI] = ELFOSABI_NETBSD; #elif defined TCC_TARGET_ARM && defined TCC_ARM_EABI ehdr.e_flags = EF_ARM_EABI_VER5; ehdr.e_flags |= s1->float_abi == ARM_HARD_FLOAT diff --git a/tccrun.c b/tccrun.c index 2a888a64..81304d5e 100644 --- a/tccrun.c +++ b/tccrun.c @@ -121,6 +121,9 @@ static int rt_mem(TCCState *s1, int size) ftruncate(fd, size); ptr = mmap(NULL, size * 2, PROT_READ|PROT_EXEC|(s1->do_debug ? PROT_WRITE : 0), MAP_SHARED, fd, 0); + if (ptr == MAP_FAILED) + /* Some targets do not support PROT_EXEC + PROT_WRITE */ + ptr = mmap(NULL, size * 2, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); /* mmap RW memory at fixed distance */ prw = mmap((char*)ptr + size, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, 0); close(fd); @@ -356,13 +359,23 @@ redo: if (copy == 3) return 0; +#if defined TCC_TARGET_MACHO + for (k = 0; k < 3; ++k) { /* 0:rx, 1:ro, 3:rw sections */ +#else for (k = 0; k < 4; ++k) { /* 0:rx, 1:ro, 2:ro debug , 3:rw sections */ +#endif n = 0; addr = 0; for(i = 1; i < s1->nb_sections; i++) { +#if defined TCC_TARGET_MACHO + static const char shf[] = { + SHF_ALLOC|SHF_EXECINSTR, SHF_ALLOC, SHF_ALLOC|SHF_WRITE + }; +#else static const char shf[] = { SHF_ALLOC|SHF_EXECINSTR, SHF_ALLOC, 0, SHF_ALLOC|SHF_WRITE }; if (k == 2 && s1->do_debug == 0) continue; +#endif s = s1->sections[i]; if (shf[k] != (s->sh_flags & (SHF_ALLOC|SHF_WRITE|SHF_EXECINSTR))) continue;