X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fdllwrap.c;h=f90ab7feb2935c45baae2c0cad288cf6d374bb8f;hb=c2274b2767dba3175e585bd17f9f4a93b56cdc63;hp=84606fb2b8ea9c743c3577dcd1f85a1a953324f6;hpb=2481e6a24fbcf780f29ea9098600271347df57e3;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/dllwrap.c b/binutils/dllwrap.c index 84606fb2b8..f90ab7feb2 100644 --- a/binutils/dllwrap.c +++ b/binutils/dllwrap.c @@ -1,5 +1,5 @@ /* dllwrap.c -- wrapper for DLLTOOL and GCC to generate PE style DLLs - Copyright (C) 1998, 1999 Free Software Foundation, Inc. + Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Mumit Khan (khan@xraylith.wisc.edu). This file is part of GNU Binutils. @@ -36,7 +36,6 @@ #include "getopt.h" #include "dyn-string.h" -#include #include #include @@ -78,7 +77,6 @@ #endif /* defined (_WIN32) && ! defined (__CYGWIN32__) */ #endif /* ! HAVE_SYS_WAIT_H */ -static char *program_version = "0.2.4"; static char *driver_name = NULL; static char *cygwin_driver_flags = "-Wl,--dll -nostartfiles"; @@ -94,7 +92,7 @@ static char *target = TARGET; typedef enum { UNKNOWN_TARGET, CYGWIN_TARGET, - MINGW32_TARGET + MINGW_TARGET } target_type; @@ -120,6 +118,7 @@ static int run PARAMS ((const char *, char *)); static void usage PARAMS ((FILE *, int)); static void display PARAMS ((const char *, va_list)); static void inform PARAMS ((const char *, ...)); +static void warn PARAMS ((const char *format, ...)); static char *look_for_prog PARAMS ((const char *, const char *, int)); static char *deduce_name PARAMS ((const char *)); static void delete_temp_files PARAMS ((void)); @@ -144,37 +143,63 @@ display (message, args) fprintf (stderr, "%s: ", program_name); vfprintf (stderr, message, args); - - if (message [strlen (message) - 1] != '\n') - fputc ('\n', stderr); -} + fputc ('\n', stderr); +} -static void #ifdef __STDC__ +static void inform (const char * message, ...) +{ + va_list args; + + if (!verbose) + return; + + va_start (args, message); + display (message, args); + va_end (args); +} + +static void +warn (const char *format, ...) +{ + va_list args; + + va_start (args, format); + display (format, args); + va_end (args); +} #else + +static void inform (message, va_alist) const char * message; va_dcl -#endif { va_list args; - + if (!verbose) return; -#ifdef __STDC__ - va_start (args, message); -#else va_start (args); -#endif - display (message, args); - va_end (args); } +static void +warn (format, va_alist) + const char *format; + va_dcl +{ + va_list args; + + va_start (args); + display (format, args); + va_end (args); +} +#endif + /* Look for the program formed by concatenating PROG_NAME and the string running from PREFIX to END_PREFIX. If the concatenated string contains a '/', try appending EXECUTABLE_SUFFIX if it is @@ -304,9 +329,12 @@ delete_temp_files () if (delete_base_file && base_file_name) { if (verbose) - fprintf (stderr, "%s temporary base file %s\n", - dontdeltemps ? "Keeping" : "Deleting", - base_file_name); + { + if (dontdeltemps) + warn (_("Keeping temporary base file %s"), base_file_name); + else + warn (_("Deleting temporary base file %s"), base_file_name); + } if (! dontdeltemps) { unlink (base_file_name); @@ -317,9 +345,12 @@ delete_temp_files () if (delete_exp_file && exp_file_name) { if (verbose) - fprintf (stderr, "%s temporary exp file %s\n", - dontdeltemps ? "Keeping" : "Deleting", - exp_file_name); + { + if (dontdeltemps) + warn (_("Keeping temporary exp file %s"), exp_file_name); + else + warn (_("Deleting temporary exp file %s"), exp_file_name); + } if (! dontdeltemps) { unlink (exp_file_name); @@ -329,9 +360,12 @@ delete_temp_files () if (delete_def_file && def_file_name) { if (verbose) - fprintf (stderr, "%s temporary def file %s\n", - dontdeltemps ? "Keeping" : "Deleting", - def_file_name); + { + if (dontdeltemps) + warn (_("Keeping temporary def file %s"), def_file_name); + else + warn (_("Deleting temporary def file %s"), def_file_name); + } if (! dontdeltemps) { unlink (def_file_name); @@ -413,21 +447,19 @@ run (what, args) pid = pwait (pid, &wait_status, 0); if (pid == -1) { - fprintf (stderr, "%s: wait: %s\n", program_name, strerror (errno)); + warn ("wait: %s", strerror (errno)); retcode = 1; } else if (WIFSIGNALED (wait_status)) { - fprintf (stderr, "%s: subprocess got fatal signal %d\n", - program_name, WTERMSIG (wait_status)); + warn (_("subprocess got fatal signal %d"), WTERMSIG (wait_status)); retcode = 1; } else if (WIFEXITED (wait_status)) { if (WEXITSTATUS (wait_status) != 0) { - fprintf (stderr, "%s: %s exited with status %d\n", - program_name, what, WEXITSTATUS (wait_status)); + warn (_("%s exited with status %d"), what, WEXITSTATUS (wait_status)); retcode = 1; } } @@ -479,61 +511,47 @@ strhash (const char *str) /**********************************************************************/ -void -print_version (name) - const char *name; -{ - /* This output is intended to follow the GNU standards document. */ - /* xgettext:c-format */ - printf ("GNU %s %s\n", name, program_version); - printf ("Copyright 1998 Free Software Foundation, Inc.\n"); - printf ("\ -This program is free software; you may redistribute it under the terms of\n\ -the GNU General Public License. This program has absolutely no warranty.\n"); - exit (0); -} - static void usage (file, status) FILE *file; int status; { - fprintf (file, "Usage %s \n", program_name); - fprintf (file, " Generic options:\n"); - fprintf (file, " --quiet, -q Work quietly\n"); - fprintf (file, " --verbose, -v Verbose\n"); - fprintf (file, " --version Print dllwrap version\n"); - fprintf (file, " --implib Synonym for --output-lib\n"); - fprintf (file, " Options for %s:\n", program_name); - fprintf (file, " --driver-name Defaults to \"gcc\"\n"); - fprintf (file, " --driver-flags Override default ld flags\n"); - fprintf (file, " --dlltool-name Defaults to \"dlltool\"\n"); - fprintf (file, " --entry Specify alternate DLL entry point\n"); - fprintf (file, " --image-base Specify image base address\n"); - fprintf (file, " --target i386-cygwin32 or i386-mingw32\n"); - fprintf (file, " --dry-run Show what needs to be run\n"); - fprintf (file, " --mno-cygwin Create Mingw DLL\n"); - fprintf (file, " Options passed to DLLTOOL:\n"); - fprintf (file, " --machine \n"); - fprintf (file, " --output-exp Generate export file.\n"); - fprintf (file, " --output-lib Generate input library.\n"); - fprintf (file, " --add-indirect Add dll indirects to export file.\n"); - fprintf (file, " --dllname Name of input dll to put into output lib.\n"); - fprintf (file, " --def Name input .def file\n"); - fprintf (file, " --output-def Name output .def file\n"); - fprintf (file, " --export-all-symbols Export all symbols to .def\n"); - fprintf (file, " --no-export-all-symbols Only export .drectve symbols\n"); - fprintf (file, " --exclude-symbols Exclude from .def\n"); - fprintf (file, " --no-default-excludes Zap default exclude symbols\n"); - fprintf (file, " --base-file Read linker generated base file\n"); - fprintf (file, " --no-idata4 Don't generate idata$4 section\n"); - fprintf (file, " --no-idata5 Don't generate idata$5 section\n"); - fprintf (file, " -U Add underscores to .lib\n"); - fprintf (file, " -k Kill @ from exported names\n"); - fprintf (file, " --add-stdcall-alias Add aliases without @\n"); - fprintf (file, " --as Use for assembler\n"); - fprintf (file, " --nodelete Keep temp files.\n"); - fprintf (file, " Rest are passed unmodified to the language driver\n"); + fprintf (file, _("Usage %s \n"), program_name); + fprintf (file, _(" Generic options:\n")); + fprintf (file, _(" --quiet, -q Work quietly\n")); + fprintf (file, _(" --verbose, -v Verbose\n")); + fprintf (file, _(" --version Print dllwrap version\n")); + fprintf (file, _(" --implib Synonym for --output-lib\n")); + fprintf (file, _(" Options for %s:\n"), program_name); + fprintf (file, _(" --driver-name Defaults to \"gcc\"\n")); + fprintf (file, _(" --driver-flags Override default ld flags\n")); + fprintf (file, _(" --dlltool-name Defaults to \"dlltool\"\n")); + fprintf (file, _(" --entry Specify alternate DLL entry point\n")); + fprintf (file, _(" --image-base Specify image base address\n")); + fprintf (file, _(" --target i386-cygwin32 or i386-mingw32\n")); + fprintf (file, _(" --dry-run Show what needs to be run\n")); + fprintf (file, _(" --mno-cygwin Create Mingw DLL\n")); + fprintf (file, _(" Options passed to DLLTOOL:\n")); + fprintf (file, _(" --machine \n")); + fprintf (file, _(" --output-exp Generate export file.\n")); + fprintf (file, _(" --output-lib Generate input library.\n")); + fprintf (file, _(" --add-indirect Add dll indirects to export file.\n")); + fprintf (file, _(" --dllname Name of input dll to put into output lib.\n")); + fprintf (file, _(" --def Name input .def file\n")); + fprintf (file, _(" --output-def Name output .def file\n")); + fprintf (file, _(" --export-all-symbols Export all symbols to .def\n")); + fprintf (file, _(" --no-export-all-symbols Only export .drectve symbols\n")); + fprintf (file, _(" --exclude-symbols Exclude from .def\n")); + fprintf (file, _(" --no-default-excludes Zap default exclude symbols\n")); + fprintf (file, _(" --base-file Read linker generated base file\n")); + fprintf (file, _(" --no-idata4 Don't generate idata$4 section\n")); + fprintf (file, _(" --no-idata5 Don't generate idata$5 section\n")); + fprintf (file, _(" -U Add underscores to .lib\n")); + fprintf (file, _(" -k Kill @ from exported names\n")); + fprintf (file, _(" --add-stdcall-alias Add aliases without @\n")); + fprintf (file, _(" --as Use for assembler\n")); + fprintf (file, _(" --nodelete Keep temp files.\n")); + fprintf (file, _(" Rest are passed unmodified to the language driver\n")); fprintf (file, "\n\n"); exit (status); } @@ -614,7 +632,7 @@ static const struct option long_options[] = {"add-indirect", no_argument, NULL, OPTION_ADD_INDIRECT}, {"base-file", required_argument, NULL, OPTION_BASE_FILE}, {"as", required_argument, NULL, OPTION_AS}, - {0} + {0, 0, 0, 0} }; int @@ -645,6 +663,15 @@ main (argc, argv) program_name = argv[0]; +#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) + setlocale (LC_MESSAGES, ""); +#endif +#if defined (HAVE_SETLOCALE) + setlocale (LC_CTYPE, ""); +#endif + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + saved_argv = (char **) xmalloc (argc * sizeof (char*)); dlltool_arg_indices = (int *) xmalloc (argc * sizeof (int)); driver_arg_indices = (int *) xmalloc (argc * sizeof (int)); @@ -794,9 +821,7 @@ main (argc, argv) /* sanity checks. */ if (! dll_name && ! dll_file_name) { - fprintf (stderr, - "%s: Must provide at least one of -o or --dllname options\n", - program_name); + warn (_("Must provide at least one of -o or --dllname options")); exit (1); } else if (! dll_name) @@ -824,16 +849,15 @@ main (argc, argv) delete_def_file = 1; free (fileprefix); delete_def_file = 1; - fprintf (stderr, "Warning: no export definition file provided\n"); - fprintf (stderr, - "dllwrap will create one, but may not be what you want\n"); + warn (_("no export definition file provided.\n\ +Creating one, but that may not be what you want")); } /* set the target platform. */ - if (strstr (target, "cygwin32")) + if (strstr (target, "cygwin")) which_target = CYGWIN_TARGET; - else if (strstr (target, "mingw32")) - which_target = MINGW32_TARGET; + else if (strstr (target, "mingw")) + which_target = MINGW_TARGET; else which_target = UNKNOWN_TARGET; @@ -841,10 +865,10 @@ main (argc, argv) dlltool_cmdline = dyn_string_new (cmdline_len); if (verbose) { - dyn_string_append (dlltool_cmdline, " -v"); + dyn_string_append_cstr (dlltool_cmdline, " -v"); } - dyn_string_append (dlltool_cmdline, " --dllname "); - dyn_string_append (dlltool_cmdline, dll_name); + dyn_string_append_cstr (dlltool_cmdline, " --dllname "); + dyn_string_append_cstr (dlltool_cmdline, dll_name); for (i = 1; i < argc; ++i) { @@ -852,10 +876,10 @@ main (argc, argv) { char *arg = saved_argv[i]; int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (dlltool_cmdline, + dyn_string_append_cstr (dlltool_cmdline, (quote) ? " \"" : " "); - dyn_string_append (dlltool_cmdline, arg); - dyn_string_append (dlltool_cmdline, + dyn_string_append_cstr (dlltool_cmdline, arg); + dyn_string_append_cstr (dlltool_cmdline, (quote) ? "\"" : ""); } } @@ -869,7 +893,7 @@ main (argc, argv) driver_flags = cygwin_driver_flags; break; - case MINGW32_TARGET: + case MINGW_TARGET: driver_flags = mingw32_driver_flags; break; @@ -878,9 +902,9 @@ main (argc, argv) break; } } - dyn_string_append (driver_cmdline, driver_flags); - dyn_string_append (driver_cmdline, " -o "); - dyn_string_append (driver_cmdline, dll_file_name); + dyn_string_append_cstr (driver_cmdline, driver_flags); + dyn_string_append_cstr (driver_cmdline, " -o "); + dyn_string_append_cstr (driver_cmdline, dll_file_name); if (! entry_point || strlen (entry_point) == 0) { @@ -890,7 +914,7 @@ main (argc, argv) entry_point = "__cygwin_dll_entry@12"; break; - case MINGW32_TARGET: + case MINGW_TARGET: entry_point = "_DllMainCRTStartup@12"; break; @@ -899,10 +923,10 @@ main (argc, argv) break; } } - dyn_string_append (driver_cmdline, " -Wl,-e,"); - dyn_string_append (driver_cmdline, entry_point); - dyn_string_append (dlltool_cmdline, " --exclude-symbol="); - dyn_string_append (dlltool_cmdline, + dyn_string_append_cstr (driver_cmdline, " -Wl,-e,"); + dyn_string_append_cstr (driver_cmdline, entry_point); + dyn_string_append_cstr (dlltool_cmdline, " --exclude-symbol="); + dyn_string_append_cstr (dlltool_cmdline, (entry_point[0] == '_') ? entry_point+1 : entry_point); if (! image_base_str || strlen (image_base_str) == 0) @@ -913,12 +937,12 @@ main (argc, argv) image_base_str = tmpbuf; } - dyn_string_append (driver_cmdline, " -Wl,--image-base,"); - dyn_string_append (driver_cmdline, image_base_str); + dyn_string_append_cstr (driver_cmdline, " -Wl,--image-base,"); + dyn_string_append_cstr (driver_cmdline, image_base_str); if (verbose) { - dyn_string_append (driver_cmdline, " -v"); + dyn_string_append_cstr (driver_cmdline, " -v"); } for (i = 1; i < argc; ++i) @@ -927,10 +951,10 @@ main (argc, argv) { char *arg = saved_argv[i]; int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (driver_cmdline, + dyn_string_append_cstr (driver_cmdline, (quote) ? " \"" : " "); - dyn_string_append (driver_cmdline, arg); - dyn_string_append (driver_cmdline, + dyn_string_append_cstr (driver_cmdline, arg); + dyn_string_append_cstr (driver_cmdline, (quote) ? "\"" : ""); } } @@ -947,15 +971,15 @@ main (argc, argv) step_pre1 = dyn_string_new (1024); - dyn_string_append (step_pre1, dlltool_cmdline->s); + dyn_string_append_cstr (step_pre1, dlltool_cmdline->s); if (export_all) { - dyn_string_append (step_pre1, " --export-all --exclude-symbol="); - dyn_string_append (step_pre1, + dyn_string_append_cstr (step_pre1, " --export-all --exclude-symbol="); + dyn_string_append_cstr (step_pre1, "_cygwin_dll_entry@12,DllMainCRTStartup@12,DllMain@12,DllEntryPoint@12"); } - dyn_string_append (step_pre1, " --output-def "); - dyn_string_append (step_pre1, def_file_name); + dyn_string_append_cstr (step_pre1, " --output-def "); + dyn_string_append_cstr (step_pre1, def_file_name); for (i = 1; i < argc; ++i) { @@ -967,10 +991,10 @@ main (argc, argv) && (arg[len-1] == 'o' || arg[len-1] == 'a')) { int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (step_pre1, + dyn_string_append_cstr (step_pre1, (quote) ? " \"" : " "); - dyn_string_append (step_pre1, arg); - dyn_string_append (step_pre1, + dyn_string_append_cstr (step_pre1, arg); + dyn_string_append_cstr (step_pre1, (quote) ? "\"" : ""); } } @@ -982,15 +1006,15 @@ main (argc, argv) dyn_string_delete (step_pre1); } - dyn_string_append (dlltool_cmdline, " --def "); - dyn_string_append (dlltool_cmdline, def_file_name); + dyn_string_append_cstr (dlltool_cmdline, " --def "); + dyn_string_append_cstr (dlltool_cmdline, def_file_name); if (verbose) { - fprintf (stderr, "DLLTOOL name : %s\n", dlltool_name); - fprintf (stderr, "DLLTOOL options : %s\n", dlltool_cmdline->s); - fprintf (stderr, "DRIVER name : %s\n", driver_name); - fprintf (stderr, "DRIVER options : %s\n", driver_cmdline->s); + fprintf (stderr, _("DLLTOOL name : %s\n"), dlltool_name); + fprintf (stderr, _("DLLTOOL options : %s\n"), dlltool_cmdline->s); + fprintf (stderr, _("DRIVER name : %s\n"), driver_name); + fprintf (stderr, _("DRIVER options : %s\n"), driver_cmdline->s); } /* @@ -1020,18 +1044,18 @@ main (argc, argv) dyn_string_t step1 = dyn_string_new (driver_cmdline->length + strlen (base_file_name) + 20); - dyn_string_append (step1, "-Wl,--base-file,"); + dyn_string_append_cstr (step1, "-Wl,--base-file,"); quote = (strchr (base_file_name, ' ') || strchr (base_file_name, '\t')); - dyn_string_append (step1, + dyn_string_append_cstr (step1, (quote) ? "\"" : ""); - dyn_string_append (step1, base_file_name); - dyn_string_append (step1, + dyn_string_append_cstr (step1, base_file_name); + dyn_string_append_cstr (step1, (quote) ? "\"" : ""); if (driver_cmdline->length) { - dyn_string_append (step1, " "); - dyn_string_append (step1, driver_cmdline->s); + dyn_string_append_cstr (step1, " "); + dyn_string_append_cstr (step1, driver_cmdline->s); } if (run (driver_name, step1->s)) @@ -1071,28 +1095,28 @@ main (argc, argv) + strlen (exp_file_name) + 20); - dyn_string_append (step2, "--base-file "); + dyn_string_append_cstr (step2, "--base-file "); quote = (strchr (base_file_name, ' ') || strchr (base_file_name, '\t')); - dyn_string_append (step2, + dyn_string_append_cstr (step2, (quote) ? "\"" : ""); - dyn_string_append (step2, base_file_name); - dyn_string_append (step2, + dyn_string_append_cstr (step2, base_file_name); + dyn_string_append_cstr (step2, (quote) ? "\" " : " "); - dyn_string_append (step2, "--output-exp "); + dyn_string_append_cstr (step2, "--output-exp "); quote = (strchr (exp_file_name, ' ') || strchr (exp_file_name, '\t')); - dyn_string_append (step2, + dyn_string_append_cstr (step2, (quote) ? "\"" : ""); - dyn_string_append (step2, exp_file_name); - dyn_string_append (step2, + dyn_string_append_cstr (step2, exp_file_name); + dyn_string_append_cstr (step2, (quote) ? "\"" : ""); if (dlltool_cmdline->length) { - dyn_string_append (step2, " "); - dyn_string_append (step2, dlltool_cmdline->s); + dyn_string_append_cstr (step2, " "); + dyn_string_append_cstr (step2, dlltool_cmdline->s); } if (run (dlltool_name, step2->s)) @@ -1115,27 +1139,27 @@ main (argc, argv) + strlen (exp_file_name) + strlen (base_file_name) + 20); - dyn_string_append (step3, "-Wl,--base-file,"); + dyn_string_append_cstr (step3, "-Wl,--base-file,"); quote = (strchr (base_file_name, ' ') || strchr (base_file_name, '\t')); - dyn_string_append (step3, + dyn_string_append_cstr (step3, (quote) ? "\"" : ""); - dyn_string_append (step3, base_file_name); - dyn_string_append (step3, + dyn_string_append_cstr (step3, base_file_name); + dyn_string_append_cstr (step3, (quote) ? "\" " : " "); quote = (strchr (exp_file_name, ' ') || strchr (exp_file_name, '\t')); - dyn_string_append (step3, + dyn_string_append_cstr (step3, (quote) ? "\"" : ""); - dyn_string_append (step3, exp_file_name); - dyn_string_append (step3, + dyn_string_append_cstr (step3, exp_file_name); + dyn_string_append_cstr (step3, (quote) ? "\"" : ""); if (driver_cmdline->length) { - dyn_string_append (step3, " "); - dyn_string_append (step3, driver_cmdline->s); + dyn_string_append_cstr (step3, " "); + dyn_string_append_cstr (step3, driver_cmdline->s); } if (run (driver_name, step3->s)) @@ -1156,34 +1180,34 @@ main (argc, argv) + strlen (exp_file_name) + 20); - dyn_string_append (step4, "--base-file "); + dyn_string_append_cstr (step4, "--base-file "); quote = (strchr (base_file_name, ' ') || strchr (base_file_name, '\t')); - dyn_string_append (step4, + dyn_string_append_cstr (step4, (quote) ? "\"" : ""); - dyn_string_append (step4, base_file_name); - dyn_string_append (step4, + dyn_string_append_cstr (step4, base_file_name); + dyn_string_append_cstr (step4, (quote) ? "\" " : " "); - dyn_string_append (step4, "--output-exp "); + dyn_string_append_cstr (step4, "--output-exp "); quote = (strchr (exp_file_name, ' ') || strchr (exp_file_name, '\t')); - dyn_string_append (step4, + dyn_string_append_cstr (step4, (quote) ? "\"" : ""); - dyn_string_append (step4, exp_file_name); - dyn_string_append (step4, + dyn_string_append_cstr (step4, exp_file_name); + dyn_string_append_cstr (step4, (quote) ? "\"" : ""); if (dlltool_cmdline->length) { - dyn_string_append (step4, " "); - dyn_string_append (step4, dlltool_cmdline->s); + dyn_string_append_cstr (step4, " "); + dyn_string_append_cstr (step4, dlltool_cmdline->s); } if (output_lib_file_name) { - dyn_string_append (step4, " --output-lib "); - dyn_string_append (step4, output_lib_file_name); + dyn_string_append_cstr (step4, " --output-lib "); + dyn_string_append_cstr (step4, output_lib_file_name); } if (run (dlltool_name, step4->s)) @@ -1209,16 +1233,16 @@ main (argc, argv) + 20); quote = (strchr (exp_file_name, ' ') || strchr (exp_file_name, '\t')); - dyn_string_append (step5, + dyn_string_append_cstr (step5, (quote) ? "\"" : ""); - dyn_string_append (step5, exp_file_name); - dyn_string_append (step5, + dyn_string_append_cstr (step5, exp_file_name); + dyn_string_append_cstr (step5, (quote) ? "\"" : ""); if (driver_cmdline->length) { - dyn_string_append (step5, " "); - dyn_string_append (step5, driver_cmdline->s); + dyn_string_append_cstr (step5, " "); + dyn_string_append_cstr (step5, driver_cmdline->s); } if (run (driver_name, step5->s))