From 34dabe496f367db5b6cece5ac0b396dc9c074c99 Mon Sep 17 00:00:00 2001 From: Detlef Riekenberg Date: Mon, 5 Apr 2010 22:56:33 +0200 Subject: [PATCH] libtcc: Detect (but ignore) -init and -fini for -Wl -- By by ... Detlef --- libtcc.c | 31 ++++++++++++++++++++----------- libtcc.h | 2 +- tcc.c | 2 +- tcc.h | 4 ++++ 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;