aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libtcc.c31
-rw-r--r--libtcc.h2
-rw-r--r--tcc.c2
-rw-r--r--tcc.h4
4 files changed, 26 insertions, 13 deletions
diff --git a/libtcc.c b/libtcc.c
index 3dae22c..6a88089 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1395,7 +1395,7 @@ PUB_FUNC int tcc_set_flag(TCCState *s, const char *flag_name, int value)
}
-static int strstart(const char *str, const char *val, const char **ptr)
+static int strstart(const char *str, const char *val, char **ptr)
{
const char *p, *q;
p = str;
@@ -1407,27 +1407,36 @@ static int strstart(const char *str, const char *val, const char **ptr)
q++;
}
if (ptr)
- *ptr = p;
+ *ptr = (char *) p;
return 1;
}
/* set linker options */
-PUB_FUNC const char * tcc_set_linker(TCCState *s, const char *option, int multi)
+PUB_FUNC const char * tcc_set_linker(TCCState *s, char *option, int multi)
{
- const char *p = option;
- char *end = NULL;
+ char *p = option;
+ char *end;
while (option && *option) {
-
+ end = NULL;
if (strstart(option, "-Bsymbolic", &p)) {
s->symbolic = TRUE;
#ifdef TCC_TARGET_PE
} else if (strstart(option, "--file-alignment,", &p)) {
s->pe_file_align = strtoul(p, &end, 16);
#endif
+ } else if (strstart(option, "-fini,", &p)) {
+ s->fini_symbol = p;
+ if (s->warn_unsupported)
+ warning("ignoring -fini %s", p);
+
} else if (strstart(option, "--image-base,", &p)) {
s->text_addr = strtoul(p, &end, 16);
s->has_text_addr = 1;
+ } else if (strstart(option, "-init,", &p)) {
+ s->init_symbol = p;
+ if (s->warn_unsupported)
+ warning("ignoring -init %s", p);
} else if (strstart(option, "--oformat,", &p)) {
#if defined(TCC_TARGET_PE)
@@ -1496,11 +1505,11 @@ PUB_FUNC const char * tcc_set_linker(TCCState *s, const char *option, int multi)
}
if (multi) {
- if (end) {
- option = end;
- } else {
- option = strchr(p, ',');
- if (option) option++;
+ option = NULL;
+ p = strchr( (end) ? end : p, ',');
+ if (p) {
+ *p = 0; /* terminate last option */
+ option = ++p;
}
} else
option = NULL;
diff --git a/libtcc.h b/libtcc.h
index c25ab0f..339dec1 100644
--- a/libtcc.h
+++ b/libtcc.h
@@ -32,7 +32,7 @@ LIBTCCAPI void tcc_set_error_func(TCCState *s, void *error_opaque,
LIBTCCAPI int tcc_set_warning(TCCState *s, const char *warning_name, int value);
/* set linker option */
-LIBTCCAPI const char * tcc_set_linker(TCCState *s, const char *option, int multi);
+LIBTCCAPI const char * tcc_set_linker(TCCState *s, char *option, int multi);
/*****************************/
/* preprocessor */
diff --git a/tcc.c b/tcc.c
index 0653773..d0ed8f6 100644
--- a/tcc.c
+++ b/tcc.c
@@ -367,7 +367,7 @@ static int parse_args(TCCState *s, int argc, char **argv)
break;
case TCC_OPTION_Wl:
{
- if ((r = (char *)tcc_set_linker(s, optarg, TRUE)))
+ if ((r = (char *) tcc_set_linker(s, (char *)optarg, TRUE)))
error("unsupported linker option '%s'", r);
}
break;
diff --git a/tcc.h b/tcc.h
index 21cce75..a7b6aa6 100644
--- a/tcc.h
+++ b/tcc.h
@@ -462,6 +462,10 @@ struct TCCState {
/* address of text section */
unsigned long text_addr;
int has_text_addr;
+
+ /* symbols to call at load-time / unload-time */
+ const char *init_symbol;
+ const char *fini_symbol;
/* output format, see TCC_OUTPUT_FORMAT_xxx */
int output_format;