From a9b34532453a065991b32f15055adf76fa86ff8c Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 14 Feb 2020 11:53:55 +0200 Subject: Fix argv[] in programs invoked by gdbserver on MS-Windows gdbserver/ChangeLog 2020-02-14 Eli Zaretskii * win32-low.c (create_process): Prepend PROGRAM to ARGS when preparing the command line for CreateProcess. (win32_create_inferior): Reflect the program name in debugging output that shows the process and its command line. --- gdbserver/ChangeLog | 7 +++++++ gdbserver/win32-low.cc | 44 ++++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index 6e6c268..e95177e 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2020-02-14 Eli Zaretskii + + * win32-low.c (create_process): Prepend PROGRAM to ARGS when + preparing the command line for CreateProcess. + (win32_create_inferior): Reflect the program name in debugging + output that shows the process and its command line. + 2020-02-13 Simon Marchi * Makefile.in: Rename source files from .c to .cc. diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 557c90d..cdd70da 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -559,21 +559,25 @@ create_process (const char *program, char *args, { const char *inferior_cwd = get_inferior_cwd (); BOOL ret; + size_t argslen, proglen; + + proglen = strlen (program) + 1; + argslen = strlen (args) + proglen; #ifdef _WIN32_WCE wchar_t *p, *wprogram, *wargs, *wcwd = NULL; - size_t argslen; - wprogram = alloca ((strlen (program) + 1) * sizeof (wchar_t)); - mbstowcs (wprogram, program, strlen (program) + 1); + wprogram = (wchar_t *) alloca (proglen * sizeof (wchar_t)); + mbstowcs (wprogram, program, proglen); for (p = wprogram; *p; ++p) if (L'/' == *p) *p = L'\\'; - argslen = strlen (args); wargs = alloca ((argslen + 1) * sizeof (wchar_t)); - mbstowcs (wargs, args, argslen + 1); + wcscpy (wargs, wprogram); + wcscat (wargs, L" "); + mbstowcs (wargs + proglen, args, argslen + 1 - proglen); if (inferior_cwd != NULL) { @@ -601,20 +605,24 @@ Could not convert the expanded inferior cwd to wide-char.")); pi); /* proc info */ #else STARTUPINFOA si = { sizeof (STARTUPINFOA) }; - - ret = CreateProcessA (program, /* image name */ - args, /* command line */ - NULL, /* security */ - NULL, /* thread */ - TRUE, /* inherit handles */ - flags, /* start flags */ - NULL, /* environment */ + char *program_and_args = (char *) alloca (argslen + 1); + + strcpy (program_and_args, program); + strcat (program_and_args, " "); + strcat (program_and_args, args); + ret = CreateProcessA (program, /* image name */ + program_and_args, /* command line */ + NULL, /* security */ + NULL, /* thread */ + TRUE, /* inherit handles */ + flags, /* start flags */ + NULL, /* environment */ /* current directory */ (inferior_cwd == NULL ? NULL : gdb_tilde_expand (inferior_cwd).c_str()), - &si, /* start info */ - pi); /* proc info */ + &si, /* start info */ + pi); /* proc info */ #endif return ret; @@ -665,7 +673,7 @@ win32_create_inferior (const char *program, program = real_path; #endif - OUTMSG2 (("Command line is \"%s\"\n", args)); + OUTMSG2 (("Command line is \"%s %s\"\n", program, args)); #ifdef CREATE_NEW_PROCESS_GROUP flags |= CREATE_NEW_PROCESS_GROUP; @@ -688,12 +696,12 @@ win32_create_inferior (const char *program, if (!ret) { - error ("Error creating process \"%s%s\", (error %d): %s\n", + error ("Error creating process \"%s %s\", (error %d): %s\n", program, args, (int) err, strwinerror (err)); } else { - OUTMSG2 (("Process created: %s\n", (char *) args)); + OUTMSG2 (("Process created: %s %s\n", program, (char *) args)); } #ifndef _WIN32_WCE -- cgit v1.1