From 05108a3b0a8eff70739b253b8995999b1861f9f2 Mon Sep 17 00:00:00 2001 From: grischka Date: Tue, 12 Feb 2013 19:13:28 +0100 Subject: libtcc: new LIBTCCAPI tcc_set_options(TCCState*, const char*str) This replaces -> use instead: ----------------------------------- - tcc_set_linker -> tcc_set_options(s, "-Wl,..."); - tcc_set_warning -> tcc_set_options(s, "-W..."); - tcc_enable_debug -> tcc_set_options(s, "-g"); parse_args is moved to libtcc.c (now tcc_parse_args). Also some cleanups: - reorder TCCState members - add some comments here and there - do not use argv's directly, make string copies - use const char* in tcc_set_linker - tccpe: use fd instead of fp tested with -D MEM_DEBUG: 0 bytes left --- tccrun.c | 78 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 37 deletions(-) (limited to 'tccrun.c') diff --git a/tccrun.c b/tccrun.c index b647962..50178a8 100644 --- a/tccrun.c +++ b/tccrun.c @@ -54,33 +54,36 @@ LIBTCCAPI int tcc_relocate(TCCState *s1, void *ptr) if (TCC_RELOCATE_AUTO != ptr) return tcc_relocate_ex(s1, ptr); + ret = tcc_relocate_ex(s1, NULL); + if (ret < 0) + return ret; + #ifdef HAVE_SELINUX - /* Use mmap instead of malloc for Selinux - Ref http://www.gnu.org/s/libc/manual/html_node/File-Size.html */ - char tmpfname[] = "/tmp/.tccrunXXXXXX"; - int fd = mkstemp (tmpfname); - if ((ret= tcc_relocate_ex(s1,NULL)) < 0)return -1; - s1->mem_size=ret; - unlink (tmpfname); ftruncate (fd, s1->mem_size); - s1->write_mem = mmap (NULL, ret, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, 0); - if(s1->write_mem == MAP_FAILED){ - tcc_error("/tmp not writeable"); - return -1; - } - s1->runtime_mem = mmap (NULL, ret, PROT_READ|PROT_EXEC, - MAP_SHARED, fd, 0); - if(s1->runtime_mem == MAP_FAILED){ - tcc_error("/tmp not executable"); - return -1; + { /* Use mmap instead of malloc for Selinux. Ref: + http://www.gnu.org/s/libc/manual/html_node/File-Size.html */ + + char tmpfname[] = "/tmp/.tccrunXXXXXX"; + int fd = mkstemp (tmpfname); + + s1->mem_size = ret; + unlink (tmpfname); + ftruncate (fd, s1->mem_size); + + s1->write_mem = mmap (NULL, ret, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0); + if (s1->write_mem == MAP_FAILED) + tcc_error("/tmp not writeable"); + + s1->runtime_mem = mmap (NULL, ret, PROT_READ|PROT_EXEC, + MAP_SHARED, fd, 0); + if (s1->runtime_mem == MAP_FAILED) + tcc_error("/tmp not executable"); + + ret = tcc_relocate_ex(s1, s1->write_mem); } - ret = tcc_relocate_ex(s1, s1->write_mem); #else - ret = tcc_relocate_ex(s1, NULL); - if (-1 != ret) { - s1->runtime_mem = tcc_malloc(ret); - ret = tcc_relocate_ex(s1, s1->runtime_mem); - } + s1->runtime_mem = tcc_malloc(ret); + ret = tcc_relocate_ex(s1, s1->runtime_mem); #endif return ret; } @@ -130,8 +133,7 @@ static int tcc_relocate_ex(TCCState *s1, void *ptr) addr_t mem; int i; - if (0 == s1->runtime_added) { - s1->runtime_added = 1; + if (NULL == ptr) { s1->nb_errors = 0; #ifdef TCC_TARGET_PE pe_output_file(s1, NULL); @@ -215,6 +217,9 @@ static void set_pages_executable(void *ptr, unsigned long length) unsigned long old_protect; VirtualProtect(ptr, length, PAGE_EXECUTE_READWRITE, &old_protect); #else +#ifndef PAGESIZE +# define PAGESIZE 4096 +#endif addr_t start, end; start = (addr_t)ptr & ~(PAGESIZE - 1); end = (addr_t)ptr + length; @@ -226,7 +231,7 @@ static void set_pages_executable(void *ptr, unsigned long length) /* ------------------------------------------------------------- */ #ifdef CONFIG_TCC_BACKTRACE -PUB_FUNC void tcc_set_num_callers(int n) +ST_FUNC void tcc_set_num_callers(int n) { rt_num_callers = n; } @@ -436,6 +441,10 @@ static void sig_error(int signum, siginfo_t *siginf, void *puc) exit(255); } +#ifndef SA_SIGINFO +# define SA_SIGINFO 0x00000004u +#endif + /* Generate a stack backtrace when a CPU exception occurs. */ static void set_exception_handler(void) { @@ -663,14 +672,8 @@ static int rt_get_caller_pc(addr_t *paddr, CONTEXT *uc, int level) #endif /* _WIN32 */ #endif /* CONFIG_TCC_BACKTRACE */ /* ------------------------------------------------------------- */ - #ifdef CONFIG_TCC_STATIC -#define RTLD_LAZY 0x001 -#define RTLD_NOW 0x002 -#define RTLD_GLOBAL 0x100 -#define RTLD_DEFAULT NULL - /* dummy function for profiling */ ST_FUNC void *dlopen(const char *filename, int flag) { @@ -680,26 +683,27 @@ ST_FUNC void *dlopen(const char *filename, int flag) ST_FUNC void dlclose(void *p) { } -/* -const char *dlerror(void) + +ST_FUNC const char *dlerror(void) { return "error"; } -*/ + typedef struct TCCSyms { char *str; void *ptr; } TCCSyms; -#define TCCSYM(a) { #a, &a, }, /* add the symbol you want here if no dynamic linking is done */ static TCCSyms tcc_syms[] = { #if !defined(CONFIG_TCCBOOT) +#define TCCSYM(a) { #a, &a, }, TCCSYM(printf) TCCSYM(fprintf) TCCSYM(fopen) TCCSYM(fclose) +#undef TCCSYM #endif { NULL, NULL }, }; -- cgit v1.3.1