From 7e7e6148fdb4adbda936f80b5d4ac3d738908d95 Mon Sep 17 00:00:00 2001 From: seyko Date: Fri, 10 Apr 2015 07:37:31 +0300 Subject: fix installation amd bcheck for Windows * define targetos=Windows when --enable-tcc32-mingw, --enable-cygwin, ... * use TARGETOS insteed HOST_OS when selecting PROGS * use "$(tccdir)" insteed $(tccdir) on install (spaces in path) * install tcc.exe too * produce bcheck.o when cross-compiling too (lib/Makefile) * force bcheck.o linking by compiling inside tcc_set_output_type() a dummy program with local array. Otherwise bcheck.o may be not linked. * replace %xz format specifier with %p in bcheck (don't supported on Windows) * call a __bound_init when __bound_ptr_add, __bound_ptr_indir, __bound_new_region, __bound_delete_region called. This is because a __bound_init inside ".init" section is not called on Windows for unknown reason. * print on stderr a message when an illegal pointer is returned: there is no segmentation violation on Windows for a program compiled with "tcc -b" * remove "C:" subdir on clean if $HOST_OS = "Linux" * default CFLAGS="-Wall -g -O0" insteed CFLAGS="-Wall -g -O2" to speed up compilation and more precise debugging. --- lib/Makefile | 2 +- lib/bcheck.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/Makefile b/lib/Makefile index 90b3286..aa3984b 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -32,9 +32,9 @@ ifndef TARGET # native library endif endif endif - BCHECK_O = bcheck.o endif +BCHECK_O = bcheck.o DIR = $(TARGET) native : ../libtcc1.a diff --git a/lib/bcheck.c b/lib/bcheck.c index 6f47f80..7dcb36e 100644 --- a/lib/bcheck.c +++ b/lib/bcheck.c @@ -150,6 +150,7 @@ static BoundEntry *__bound_find_region(BoundEntry *e1, void *p) static void bound_error(const char *fmt, ...) { __bound_error_msg = fmt; + fprintf(stderr,"%s %s: %s\n", __FILE__, __FUNCTION__, fmt); *(int *)0 = 0; /* force a runtime error */ } @@ -164,6 +165,9 @@ void * FASTCALL __bound_ptr_add(void *p, size_t offset) { size_t addr = (size_t)p; BoundEntry *e; + + __bound_init(); + #if defined(BOUND_DEBUG) printf("%s %s: 0x%x %d\n", __FILE__, __FUNCTION__, (int)p, offset); #endif @@ -179,9 +183,7 @@ void * FASTCALL __bound_ptr_add(void *p, size_t offset) } addr += offset; if (addr >= e->size) { - #if defined(BOUND_DEBUG) - printf("%s %s: 0x%zx is outside of the region\n", __FILE__, __FUNCTION__, p + offset); - #endif + fprintf(stderr,"%s %s: %p is outside of the region\n", __FILE__, __FUNCTION__, p + offset); return INVALID_POINTER; /* return an invalid pointer */ } return p + offset; @@ -195,6 +197,7 @@ void * FASTCALL __bound_ptr_indir ## dsize (void *p, size_t offset) \ size_t addr = (size_t)p; \ BoundEntry *e; \ \ + __bound_init(); \ e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)]; \ e = (BoundEntry *)((char *)e + \ ((addr >> (BOUND_T3_BITS - BOUND_E_BITS)) & \ @@ -205,8 +208,10 @@ void * FASTCALL __bound_ptr_indir ## dsize (void *p, size_t offset) \ addr = (size_t)p - e->start; \ } \ addr += offset + dsize; \ - if (addr > e->size) \ + if (addr > e->size) { \ + fprintf(stderr,"%s %s: %p is outside of the region\n", __FILE__, __FUNCTION__, p + offset); \ return INVALID_POINTER; /* return an invalid pointer */ \ + } \ return p + offset; \ } @@ -228,7 +233,7 @@ void FASTCALL __bound_local_new(void *p1) { size_t addr, size, fp, *p = p1; #ifdef BOUND_DEBUG - fprintf(stderr, "%s, %s start p1=%zx *p1=%zx\n", __FILE__, __FUNCTION__, p, *p); + fprintf(stderr, "%s, %s start p1=%p *p1=%p\n", __FILE__, __FUNCTION__, p, *p); #endif GET_CALLER_FP(fp); for(;;) { @@ -364,6 +369,12 @@ void __bound_init(void) size_t start, size; size_t *p; + static int inited; + if (inited) + return; + + inited = 1; + #ifdef BOUND_DEBUG fprintf(stderr, "%s, %s() start\n", __FILE__, __FUNCTION__); #endif @@ -444,7 +455,7 @@ void __bound_main_arg(void **p) void *start = p; while (*p++); #ifdef BOUND_DEBUG - fprintf(stderr, "%s, %s calling __bound_new_region(%p, %llx)\n", + fprintf(stderr, "%s, %s calling __bound_new_region(%p, %p)\n", __FILE__, __FUNCTION__, (void *) p - start); #endif __bound_new_region(start, (void *) p - start); @@ -482,8 +493,10 @@ void __bound_new_region(void *p, size_t size) BoundEntry *page, *e, *e2; size_t t1_start, t1_end, i, t2_start, t2_end; + __bound_init(); + #ifdef BOUND_DEBUG - fprintf(stderr, "%s, %s(%p, %zx) start\n", + fprintf(stderr, "%s, %s(%p, %p) start\n", __FILE__, __FUNCTION__, p, size); #endif @@ -595,6 +608,8 @@ int __bound_delete_region(void *p) BoundEntry *page, *e, *e2; size_t t1_start, t1_end, t2_start, t2_end, i; + __bound_init(); + #ifdef BOUND_DEBUG fprintf(stderr, "%s %s() start\n", __FILE__, __FUNCTION__); #endif @@ -757,7 +772,7 @@ void *__bound_malloc(size_t size, const void *caller) return NULL; #ifdef BOUND_DEBUG - fprintf(stderr, "%s, %s calling __bound_new_region(%p, %llx)\n", + fprintf(stderr, "%s, %s calling __bound_new_region(%p, %p)\n", __FILE__, __FUNCTION__, ptr, size); #endif __bound_new_region(ptr, size); @@ -791,7 +806,7 @@ void *__bound_memalign(size_t size, size_t align, const void *caller) return NULL; #ifdef BOUND_DEBUG - fprintf(stderr, "%s, %s calling __bound_new_region(%p, %llx)\n", + fprintf(stderr, "%s, %s calling __bound_new_region(%p, %p)\n", __FILE__, __FUNCTION__, ptr, size); #endif __bound_new_region(ptr, size); -- cgit v1.3.1