aboutsummaryrefslogtreecommitdiff
path: root/tccrun.c
diff options
context:
space:
mode:
authorgrischka <grischka>2013-02-12 19:13:28 +0100
committergrischka <grischka>2013-02-12 19:13:28 +0100
commit05108a3b0a8eff70739b253b8995999b1861f9f2 (patch)
tree690c17ebe3cd0479e278bc3b65e00eba7ec674fd /tccrun.c
parent829655949b7964c66e1f7da9d44c19655dba88aa (diff)
downloadtinycc-05108a3b0a8eff70739b253b8995999b1861f9f2.tar.gz
tinycc-05108a3b0a8eff70739b253b8995999b1861f9f2.tar.bz2
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
Diffstat (limited to 'tccrun.c')
-rw-r--r--tccrun.c78
1 files changed, 41 insertions, 37 deletions
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 },
};