diff options
| author | seyko <seyko2@gmail.com> | 2015-04-10 07:37:31 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2015-04-10 07:37:31 +0300 |
| commit | 7e7e6148fdb4adbda936f80b5d4ac3d738908d95 (patch) | |
| tree | 37bb17e54d38fdb905b79ba8dfa996500f066abe /lib | |
| parent | 5cd4393a542ef4c64df7dcbb3fbe3a629666239d (diff) | |
| download | tinycc-7e7e6148fdb4adbda936f80b5d4ac3d738908d95.tar.gz tinycc-7e7e6148fdb4adbda936f80b5d4ac3d738908d95.tar.bz2 | |
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.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Makefile | 2 | ||||
| -rw-r--r-- | lib/bcheck.c | 33 |
2 files changed, 25 insertions, 10 deletions
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); |
