Always fix system DLL paths for 32bit programs
GetModuleFileNameEx might also return the 64bit system directory for 32bit programs even for a 32bit gdb: (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x779d0000 0x77b34d20 Yes (*) C:\Windows\SysWOW64\ntdll.dll 0x76850000 0x7694ad9c Yes (*) C:\Windows\syswow64\kernel32.dll 0x75421000 0x75466a18 Yes (*) C:\Windows\syswow64\KernelBase.dll 0x6fbe1000 0x6fcca1c0 Yes (*) C:\Windows\system32\dbghelp.dll 0x76d31000 0x76ddb2c4 Yes (*) C:\Windows\syswow64\msvcrt.dll So this makes the path conversion for all 32bit programs. gdb/ChangeLog: 2020-03-27 Hannes Domani <ssbssa@yahoo.de> * windows-nat.c (windows_add_all_dlls): Fix system dll paths.
This commit is contained in:
parent
258e884429
commit
ebea762639
|
@ -1,3 +1,7 @@
|
|||
2020-03-27 Hannes Domani <ssbssa@yahoo.de>
|
||||
|
||||
* windows-nat.c (windows_add_all_dlls): Fix system dll paths.
|
||||
|
||||
2020-03-26 John Baldwin <jhb@FreeBSD.org>
|
||||
|
||||
* fbsd-tdep.c (fbsd_print_auxv_entry): Handle AT_FREEBSD_BSDFLAGS.
|
||||
|
|
|
@ -2058,29 +2058,36 @@ windows_add_all_dlls (void)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef __x86_64__
|
||||
char system_dir[__PMAX];
|
||||
char syswow_dir[__PMAX];
|
||||
size_t system_dir_len = 0;
|
||||
bool convert_syswow_dir = false;
|
||||
#ifdef __x86_64__
|
||||
if (wow64_process)
|
||||
{
|
||||
UINT len = GetSystemDirectoryA (system_dir, sizeof (system_dir));
|
||||
/* Error check. */
|
||||
gdb_assert (len != 0);
|
||||
/* Check that we have passed a large enough buffer. */
|
||||
gdb_assert (len < sizeof (system_dir));
|
||||
|
||||
len = GetSystemWow64DirectoryA (syswow_dir, sizeof (syswow_dir));
|
||||
/* Error check. */
|
||||
gdb_assert (len != 0);
|
||||
/* Check that we have passed a large enough buffer. */
|
||||
gdb_assert (len < sizeof (syswow_dir));
|
||||
|
||||
strcat (system_dir, "\\");
|
||||
strcat (syswow_dir, "\\");
|
||||
system_dir_len = strlen (system_dir);
|
||||
}
|
||||
#endif
|
||||
{
|
||||
/* This fails on 32bit Windows because it has no SysWOW64 directory,
|
||||
and in this case a path conversion isn't necessary. */
|
||||
UINT len = GetSystemWow64DirectoryA (syswow_dir, sizeof (syswow_dir));
|
||||
if (len > 0)
|
||||
{
|
||||
/* Check that we have passed a large enough buffer. */
|
||||
gdb_assert (len < sizeof (syswow_dir));
|
||||
|
||||
len = GetSystemDirectoryA (system_dir, sizeof (system_dir));
|
||||
/* Error check. */
|
||||
gdb_assert (len != 0);
|
||||
/* Check that we have passed a large enough buffer. */
|
||||
gdb_assert (len < sizeof (system_dir));
|
||||
|
||||
strcat (system_dir, "\\");
|
||||
strcat (syswow_dir, "\\");
|
||||
system_dir_len = strlen (system_dir);
|
||||
|
||||
convert_syswow_dir = true;
|
||||
}
|
||||
|
||||
}
|
||||
for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
|
||||
{
|
||||
MODULEINFO mi;
|
||||
|
@ -2103,12 +2110,11 @@ windows_add_all_dlls (void)
|
|||
#else
|
||||
name = dll_name;
|
||||
#endif
|
||||
#ifdef __x86_64__
|
||||
/* Convert the DLL path of WOW64 processes returned by
|
||||
/* Convert the DLL path of 32bit processes returned by
|
||||
GetModuleFileNameEx from the 64bit system directory to the
|
||||
32bit syswow64 directory if necessary. */
|
||||
std::string syswow_dll_path;
|
||||
if (wow64_process
|
||||
if (convert_syswow_dir
|
||||
&& strncasecmp (name, system_dir, system_dir_len) == 0
|
||||
&& strchr (name + system_dir_len, '\\') == nullptr)
|
||||
{
|
||||
|
@ -2116,7 +2122,6 @@ windows_add_all_dlls (void)
|
|||
syswow_dll_path += name + system_dir_len;
|
||||
name = syswow_dll_path.c_str();
|
||||
}
|
||||
#endif
|
||||
|
||||
solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
|
||||
solib_end = solib_end->next;
|
||||
|
|
Loading…
Reference in New Issue