Always fix system DLL paths for 32bit programs
authorHannes Domani <ssbssa@yahoo.de>
Fri, 27 Mar 2020 11:34:02 +0000 (12:34 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Fri, 27 Mar 2020 21:48:03 +0000 (22:48 +0100)
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.

gdb/ChangeLog
gdb/windows-nat.c

index 10a3548fd4c0c9ca4e7d357598530fc899f42066..50c7cb4fe3b808f1ae61dc1bdfa19003d16ce03f 100644 (file)
@@ -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.
index 8547ec2f99b4c8a838c8f5a6d71c7b97d2ae67a7..0d1bb7758045cecf39ab5c546910d59a3d232386 100644 (file)
@@ -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;