@@ -121,6 +121,9 @@ static int rt_mem(TCCState *s1, int size)
121121 ftruncate (fd , size );
122122
123123 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 );
124127 /* mmap RW memory at fixed distance */
125128 prw = mmap ((char * )ptr + size , size , PROT_READ |PROT_WRITE , MAP_SHARED |MAP_FIXED , fd , 0 );
126129 close (fd );
@@ -356,13 +359,23 @@ static int tcc_relocate_ex(TCCState *s1, void *ptr, unsigned ptr_diff)
356359 if (copy == 3 )
357360 return 0 ;
358361
362+ #if defined TCC_TARGET_MACHO
363+ for (k = 0 ; k < 3 ; ++ k ) { /* 0:rx, 1:ro, 3:rw sections */
364+ #else
359365 for (k = 0 ; k < 4 ; ++ k ) { /* 0:rx, 1:ro, 2:ro debug , 3:rw sections */
366+ #endif
360367 n = 0 ; addr = 0 ;
361368 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
362374 static const char shf [] = {
363375 SHF_ALLOC |SHF_EXECINSTR , SHF_ALLOC , 0 , SHF_ALLOC |SHF_WRITE
364376 };
365377 if (k == 2 && s1 -> do_debug == 0 ) continue ;
378+ #endif
366379 s = s1 -> sections [i ];
367380 if (shf [k ] != (s -> sh_flags & (SHF_ALLOC |SHF_WRITE |SHF_EXECINSTR )))
368381 continue ;
0 commit comments