aboutsummaryrefslogtreecommitdiff
path: root/lib
Commit message (Collapse)AuthorAgeFilesLines
* lib/bcheck: Prevent libc_malloc/libc_free etc from being miscompiledKirill Smelkov2012-11-131-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On i386 and gcc-4.7 I found that libc_malloc was miscompiled - look: static void *libc_malloc(size_t size) { void *ptr; restore_malloc_hooks(); // __malloc_hook = saved_malloc_hook ptr = malloc(size); install_malloc_hooks(); // saved_malloc_hook = __malloc_hook, __malloc_hook = __bound_malloc return ptr; } .type libc_malloc, @function libc_malloc: .LFB56: .cfi_startproc pushl %edx .cfi_def_cfa_offset 8 movl %eax, (%esp) call malloc movl $__bound_malloc, __malloc_hook movl $__bound_free, __free_hook movl $__bound_realloc, __realloc_hook movl $__bound_memalign, __memalign_hook popl %ecx .cfi_def_cfa_offset 4 ret Here gcc inlined both restore_malloc_hooks() and install_malloc_hooks() and decided that saved_malloc_hook -> __malloc_hook -> saved_malloc_hook stores are not needed and could be ommitted. Only it did not know __molloc_hook affects malloc()... So add compiler barrier to both install and restore hooks functions and be done with it - the code is now ok: diff --git a/bcheck0.s b/bcheck1.s index 5f50293..4c02a5f 100644 --- a/bcheck0.s +++ b/bcheck1.s @@ -42,8 +42,24 @@ libc_malloc: .cfi_startproc pushl %edx .cfi_def_cfa_offset 8 + movl saved_malloc_hook, %edx + movl %edx, __malloc_hook + movl saved_free_hook, %edx + movl %edx, __free_hook + movl saved_realloc_hook, %edx + movl %edx, __realloc_hook + movl saved_memalign_hook, %edx + movl %edx, __memalign_hook movl %eax, (%esp) call malloc + movl __malloc_hook, %edx + movl %edx, saved_malloc_hook + movl __free_hook, %edx + movl %edx, saved_free_hook + movl __realloc_hook, %edx + movl %edx, saved_realloc_hook + movl __memalign_hook, %edx + movl %edx, saved_memalign_hook movl $__bound_malloc, __malloc_hook movl $__bound_free, __free_hook movl $__bound_realloc, __realloc_hook For barrier I use __asm__ __volatile__ ("": : : "memory") which is used as compiler barrier by Linux kernel, and mentioned in gcc docs and in wikipedia [1]. Without this patch any program compiled with tcc -b crashes in startup because of infinite recursion in libc_malloc. [1] http://en.wikipedia.org/wiki/Memory_ordering#Compiler_memory_barrier
* Honour *FLAGS everywhereThomas Preud'homme2012-11-061-3/+3
| | | | Add CPPFLAGS, CFLAGS and LDFLAGS everywhere it's missing.
* x86_64: Implement GET_CALLER_FPMichael Matz2012-04-181-0/+8
| | | | TCC always uses %rbp frames, so we can use that one.
* Further changes improving the OSX build. Everything builds. libtest passes.Milutin Jovanovic2012-03-061-4/+14
| | | | | | | | | | | | | | | | | | | | Other tests still have issues, currently with weak linking. One of the primary stumbling blocks on OSX is the lack of support for mach-o binaries. Therefore all tcc usage on OSX has to be limited to elf binaries, presumably produced by tcc itself. Therefore I had to enable building of tiny_libmaker for OSX. Then changed the make to use tcc and tiny_libmaker to compile the tcclib1. In order to compile the tests, specifically the parts that use weak linking, I have had to define MACOSX_DEPLOYMENT_TARGET to 10.2, which seems like a hack, but extensive searching seems to indicate that this is the only way to make apple gcc allow weak linking. Using any other value, bigger or smaller breaks weak linking. Also added _ANSI_SOURCE define required by some OSX headers, and some cosmetic gitignore changes. I believe these changes should not impact other platforms.
* Attempt to fix 32 bit OSX build. The fix consists of adding -m32 and -m64Milutin Jovanovic2012-02-161-2/+2
| | | | | | | | to the appropriate CFLAGS. In addition, memory hooks are very different on OSX, so build of bcheck.c had to be disabled for now. Change of the CFLAGS does affect builds on other platforms, and this needs to be tested.
* lib/alloca*: mark ELF stack access flags as nonexecutableSergei Trofimovich2011-01-043-0/+12
| | | | Signed-off-by: Sergei Trofimovich <st@anti-virus.by>
* Support struct arguments with stdarg.hShinichiro Hamaji2010-12-281-0/+79
| | | | | | | | - add __builtin_va_arg_types to check how arguments were passed - move most code of stdarg into libtcc1.c - remove __builtin_malloc and __builtin_free - add a test case based on the bug report (http://www.mail-archive.com/tinycc-devel@nongnu.org/msg03036.html)
* make: new lib/Makefile for libtcc1.a on more platformsgrischka2010-12-041-0/+90
| | | | | | win32/64 cross-compilers now build libtcc1.a and install it together with the windows headers in a 'win32' sub-directory of TCCDIR.
* build: remove #include "config.h" from target dependent filesgrischka2010-11-263-6/+0
| | | | This is to make cross build of libtcc1.a easier.
* Add support for __FreeBSD_kernel__ kernelThomas Preud'homme2010-09-101-2/+4
| | | | | Add support for kfreebsd-i386 and kfreebsd-amd64 Debian arch with thanks to Pierre Chifflier <chifflier@cpe.fr>.
* win32: enable bounds checker & exception handlergrischka2009-12-191-34/+9
| | | | exception handler borrowed from k1w1. Thanks.
* x86-64: chkstk, allocagrischka2009-07-182-2/+9
|
* bcheck: restore malloc hooks when donegrischka2009-07-181-0/+5
|
* x86-64: Align return value of alloca by 16.Shinichiro Hamaji2009-06-111-2/+2
|
* x86-64: Add alloca.Shinichiro Hamaji2009-06-091-0/+33
|
* drop alloca #definegrischka2009-05-162-4/+4
| | | | | | | (Because GNU's alloca.h unconditionally #undef's alloca) Also, remove gcc specific sections in headers. and instead change tests such that gcc does not use them.
* fix makefiles etc for subdirsgrischka2009-04-182-2/+2
|
* new subdirs: include, lib, testsgrischka2009-04-184-0/+1553