aboutsummaryrefslogtreecommitdiff
path: root/gdb/windows-nat.c
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2020-03-27 12:34:02 +0100
committerHannes Domani <ssbssa@yahoo.de>2020-03-27 22:48:03 +0100
commitebea76263935aba585f8f8b1d27b13737e231eec (patch)
tree1f2bf51a196c77f3b0e7920e8813bcb4051e5c94 /gdb/windows-nat.c
parent258e884429c87ed5ebee2b7767e3955218ec064b (diff)
downloadgdb-ebea76263935aba585f8f8b1d27b13737e231eec.zip
gdb-ebea76263935aba585f8f8b1d27b13737e231eec.tar.gz
gdb-ebea76263935aba585f8f8b1d27b13737e231eec.tar.bz2
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.
Diffstat (limited to 'gdb/windows-nat.c')
-rw-r--r--gdb/windows-nat.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 8547ec2..0d1bb77 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -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)
+#endif
{
- 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));
+ /* 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));
- 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);
+
+ convert_syswow_dir = true;
+ }
- strcat (system_dir, "\\");
- strcat (syswow_dir, "\\");
- system_dir_len = strlen (system_dir);
}
-#endif
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;