Le vendredi 16 mars 2012 22:31:18, grischka a écrit :
> Thomas Preud'homme wrote:
> >> $ tcc libtcc.c -DONE_SOURCE -shared -o libtcc.so -ldl
> > 
> > I had to add -DTCC_IS_NATIVE
> 
> Because you missed -DTCC_TARGET_X86_64 ;)
The configure did. Even if I add it to the command line it stills fails.
> 
> Btw, for general purpose dynamically grown strings, try
> 
>      CString linker_arg;
What do you think of this patch? I tried with my example and yours but I'm 
afraid of breaking things now so I prefer to attach it here.
> 
> --- grischka

Best regards.

Thomas Preud'homme
diff --git a/tcc.c b/tcc.c
index 467ef88..9f1f7c0 100644
--- a/tcc.c
+++ b/tcc.c
@@ -35,7 +35,7 @@ static int do_bench = 0;
 static int gen_deps;
 static const char *deps_outfile;
 static const char *m_option;
-static char *linker_arg;
+static CString linker_arg;
 
 #define TCC_OPTION_HAS_ARG 0x0001
 #define TCC_OPTION_NOSEP   0x0002 /* cannot have space before option and arg */
@@ -281,11 +281,11 @@ static int parse_args(TCCState *s, int argc, char **argv)
     const char *optarg, *p1, *r1;
     char *r;
     int was_pthread;
-    unsigned long linker_argsize = 0;
 
     was_pthread = 0; /* is set if commandline contains -pthread key */
 
     optind = 1;
+    cstr_new(&linker_arg);
     while (optind < argc) {
 
         r = argv[optind++];
@@ -444,16 +444,11 @@ static int parse_args(TCCState *s, int argc, char **argv)
                 s->rdynamic = 1;
                 break;
             case TCC_OPTION_Wl:
-                if (!linker_arg) {
-                    linker_argsize = strlen(optarg) + 1;
-                    linker_arg = tcc_malloc(linker_argsize);
-                    pstrcpy(linker_arg, linker_argsize, optarg);
-                }
+                if (!linker_arg.data_allocated)
+                    cstr_cat(&linker_arg, optarg);
                 else {
-                    linker_argsize += strlen(optarg) + 1;
-                    linker_arg = tcc_realloc(linker_arg, linker_argsize);
-                    pstrcat(linker_arg, linker_argsize, ",");
-                    pstrcat(linker_arg, linker_argsize, optarg);
+                    cstr_ccat(&linker_arg, ',');
+                    cstr_cat(&linker_arg, optarg);
                 }
                 break;
             case TCC_OPTION_E:
@@ -476,7 +471,7 @@ static int parse_args(TCCState *s, int argc, char **argv)
             }
         }
     }
-    if ((r = (char *) tcc_set_linker(s, (char *)linker_arg, TRUE)))
+    if ((r = (char *) tcc_set_linker(s, (char *) linker_arg.data, TRUE)))
         tcc_error("unsupported linker option '%s'", r);
     /* fixme: these options could be different on your platform */
     if (was_pthread && output_type != TCC_OUTPUT_OBJ) {
@@ -610,7 +605,7 @@ int main(int argc, char **argv)
     }
 
     tcc_delete(s);
-    tcc_free(linker_arg);
+    cstr_free(&linker_arg);
     tcc_free(outfile);
 
 #ifdef MEM_DEBUG

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to