[RFA] Fix cygwin compilation failure due to nameless LOAD_DLL_DEBUG_EVENT causes ntdll.dll to be missing

Yao Qi yao@codesourcery.com
Mon Dec 16 02:21:00 GMT 2013


On 12/14/2013 06:37 AM, Pierre Muller wrote:
> introduced a failure for cygwin native build.
> The problem is that __USEWIDE is not considered in the patch.
> 

For the record, the build failure is this:

cc1: warnings being treated as errors
../../git/gdb/windows-nat.c: In function ‘windows_ensure_ntdll_loaded’:
../../git/gdb/windows-nat.c:1773:11: error: passing argument 3 of ‘GetModuleFileNameEx’ from incompatible pointer type
../../git/gdb/windows-nat.c:1773:11: note: expected ‘LPWSTR’ but argument is of type ‘char *’
Makefile:998: recipe for target `windows-nat.o' failed

> The patch below fixes this compilation error
> and should allow cygwin to work as mingw.
> 
> Pierre Muller
> 
> 
> ChangeLog entry:
> 
> 2013-12-13  Pierre Muller  <muller@sourceware.org>
> 
> 	Fix compilation error for cygwin native build.
> 	* windows-nat.c (windows_ensure_ntdll_loaded): Add
> 	code using wchar_t type and conversion to char string
> 	if __USEWIDE is defined.

Probably, we can write

	(windows_ensure_ntdll_loaded) [__USEWIDE]: Call
	wcstombs.

> 
> 
> diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
> index f0545fc..dda9d8e 100644
> --- a/gdb/windows-nat.c
> +++ b/gdb/windows-nat.c
> @@ -1764,17 +1764,27 @@ windows_ensure_ntdll_loaded (void)
>    for (i = 0; i < (int) (cb_needed / sizeof (HMODULE)); i++)
>      {
>        MODULEINFO mi;
> +#ifdef __USEWIDE
> +      wchar_t dll_name[__PMAX];
> +      char name[__PMAX];
> +#else
>        char dll_name[__PMAX];
> -
> +      char *name;
> +#endif
>        if (GetModuleInformation (current_process_handle, hmodules[i],
>                                 &mi, sizeof (mi)) == 0)
>         continue;
>        if (GetModuleFileNameEx (current_process_handle, hmodules[i],
>                                dll_name, sizeof (dll_name)) == 0)
>         continue;
> -      if (FILENAME_CMP (lbasename (dll_name), "ntdll.dll") == 0)
> +#ifdef __USEWIDE
> +      wcstombs (name, dll_name, __PMAX);
> +#else
> +      name = dll_name;
> +#endif
> +      if (FILENAME_CMP (lbasename (name), "ntdll.dll") == 0)
>         {
> -         solib_end->next = windows_make_so (dll_name, mi.lpBaseOfDll);
> +         solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
>           solib_end = solib_end->next;
>           return;
>         }

GetModuleFileNameEx is also used in get_module_name, so probably we can
copy its pattern here too

#ifdef __CYGWIN__
  len = GetModuleFileNameEx (current_process_handle, DllHandle,
			     pathbuf, __PMAX);
  if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, dll_name_ret,
			__PMAX) < 0)
     ...
#else
  len = GetModuleFileNameEx (current_process_handle,
			     DllHandle, dll_name_ret, __PMAX);
#endif

and code is more consistent on using GetModuleFileNameEx.
-- 
Yao (齐尧)



More information about the Gdb-patches mailing list