* non-process-shared POSIX semaphores aren't supported on Darwin, we use the dispatch framework * dlsym segfaults with RTLD_NEXT from JIT code, so we must not even try this for -run. So we need to know in __bound_init if called from -run code, or from normal code, which means passing this down also from __bt_init and hence from the stub added in tcc_add_btstub * Darwin uses different structures for <ctype.h> facilities, this merely adds a warning about this * __libc_freeres doesn't exist * for non -run modus the context (.prog_base member) is constructed incorrectly (uses symbol zero for trying to get at the load bias, which doesn't really work that way), on Mach-O this errors out (and could also error out on ELF). For now deactivate this, which makes backtraces not be symbolic on MacOS for not -run.
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ------------------------------------------------------------- */
 | 
						|
/* for linking rt_printline and the signal/exception handler
 | 
						|
   from tccrun.c into executables. */
 | 
						|
 | 
						|
#define CONFIG_TCC_BACKTRACE_ONLY
 | 
						|
#include "../tccrun.c"
 | 
						|
 | 
						|
int (*__rt_error)(void*, void*, const char *, va_list);
 | 
						|
 | 
						|
#ifndef _WIN32
 | 
						|
# define __declspec(n)
 | 
						|
#endif
 | 
						|
 | 
						|
__declspec(dllexport)
 | 
						|
void __bt_init(rt_context *p, int num_callers, int mode)
 | 
						|
{
 | 
						|
    __attribute__((weak)) int main();
 | 
						|
    __attribute__((weak)) void __bound_init(void*, int);
 | 
						|
    struct rt_context *rc = &g_rtctxt;
 | 
						|
    //fprintf(stderr, "__bt_init %d %p %p %d\n", num_callers, p->stab_sym, p->bounds_start, mode), fflush(stderr);
 | 
						|
    if (num_callers) {
 | 
						|
        memcpy(rc, p, offsetof(rt_context, next));
 | 
						|
        rc->num_callers = num_callers - 1;
 | 
						|
        rc->top_func = main;
 | 
						|
        __rt_error = _rt_error;
 | 
						|
        set_exception_handler();
 | 
						|
    } else {
 | 
						|
        p->next = rc->next, rc->next = p;
 | 
						|
    }
 | 
						|
    if (__bound_init && p->bounds_start)
 | 
						|
        __bound_init(p->bounds_start, mode);
 | 
						|
}
 | 
						|
 | 
						|
/* copy a string and truncate it. */
 | 
						|
static char *pstrcpy(char *buf, size_t buf_size, const char *s)
 | 
						|
{
 | 
						|
    int l = strlen(s);
 | 
						|
    if (l >= buf_size)
 | 
						|
        l = buf_size - 1;
 | 
						|
    memcpy(buf, s, l);
 | 
						|
    buf[l] = 0;
 | 
						|
    return buf;
 | 
						|
}
 |