Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Eli Zaretskii via Gdb-patches <gdb-patches@sourceware.org>
To: Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: Subtle problems with "info sharedlibrary" on MS-Windows
Date: Sat, 10 Apr 2021 21:07:31 +0300	[thread overview]
Message-ID: <834kge57z0.fsf@gnu.org> (raw)
In-Reply-To: <87sg3ygp1d.fsf@tromey.com> (message from Tom Tromey on Sat, 10 Apr 2021 09:03:26 -0600)

> From: Tom Tromey <tom@tromey.com>
> Cc: ssbssa@yahoo.de,  Eli Zaretskii <eliz@gnu.org>
> Date: Sat, 10 Apr 2021 09:03:26 -0600
> 
> I suppose a patch similar to this is needed for gdbserver as well?

Is the below okay?

--- gdbserver/win32-low.cc~	2021-03-25 03:47:10.000000000 +0200
+++ gdbserver/win32-low.cc	2021-04-10 21:05:48.677425000 +0300
@@ -1165,11 +1165,13 @@ load_psapi (void)
 
 #ifndef _WIN32_WCE
 
-/* Iterate over all DLLs currently mapped by our inferior, and
-   add them to our list of solibs.  */
+/* Iterate over all DLLs currently mapped by our inferior, looking for
+   a DLL loaded at LOAD_ADDR; if found, return its file name,
+   otherwise return NULL.  If LOAD_ADDR is NULL, add all mapped DLLs
+   to our list of solibs.  */
 
-static void
-win32_add_all_dlls (void)
+static char *
+win32_add_dll (LPVOID load_addr)
 {
   size_t i;
   HMODULE dh_buf[1];
@@ -1178,7 +1180,7 @@ win32_add_all_dlls (void)
   BOOL ok;
 
   if (!load_psapi ())
-    return;
+    return NULL;
 
   cbNeeded = 0;
 #ifdef __x86_64__
@@ -1196,11 +1198,11 @@ win32_add_all_dlls (void)
 				      &cbNeeded);
 
   if (!ok || !cbNeeded)
-    return;
+    return NULL;
 
   DllHandle = (HMODULE *) alloca (cbNeeded);
   if (!DllHandle)
-    return;
+    return NULL;
 
 #ifdef __x86_64__
   if (wow64_process)
@@ -1216,7 +1218,7 @@ win32_add_all_dlls (void)
 				      cbNeeded,
 				      &cbNeeded);
   if (!ok)
-    return;
+    return NULL;
 
   char system_dir[MAX_PATH];
   char syswow_dir[MAX_PATH];
@@ -1252,7 +1254,7 @@ win32_add_all_dlls (void)
   for (i = 1; i < ((size_t) cbNeeded / sizeof (HMODULE)); i++)
     {
       MODULEINFO mi;
-      char dll_name[MAX_PATH];
+      static char dll_name[MAX_PATH];
 
       if (!(*win32_GetModuleInformation) (current_process_handle,
 					  DllHandle[i],
@@ -1265,6 +1267,9 @@ win32_add_all_dlls (void)
 					 MAX_PATH) == 0)
 	continue;
 
+      if (load_addr != nullptr && mi.lpBaseOfDll != load_addr)
+	continue;
+
       const char *name = dll_name;
       /* Convert the DLL path of 32bit processes returned by
 	 GetModuleFileNameEx from the 64bit system directory to the
@@ -1280,9 +1285,24 @@ win32_add_all_dlls (void)
 	}
 
       win32_add_one_solib (name, (CORE_ADDR) (uintptr_t) mi.lpBaseOfDll);
+      if (load_addr != nullptr)
+	{
+	  strcpy (dll_name, name);
+	  return dll_name;
+	}
     }
+  return NULL;
 }
-#endif
+
+/* Iterate over all DLLs currently mapped by our inferior, and
+   add them to our list of solibs.  */
+
+static void
+win32_add_all_dlls (void)
+{
+  win32_add_dll (NULL);
+}
+#endif	/* !_WIN32_WCE */
 
 typedef HANDLE (WINAPI *winapi_CreateToolhelp32Snapshot) (DWORD, DWORD);
 typedef BOOL (WINAPI *winapi_Module32First) (HANDLE, LPMODULEENTRY32);
@@ -1298,7 +1318,12 @@ windows_nat::handle_load_dll ()
 
   dll_name = get_image_name (current_process_handle,
 			     event->lpImageName, event->fUnicode);
-  if (!dll_name)
+#ifndef _WIN32_WCE
+  if (dll_name == nullptr
+      && event->lpBaseOfDll != nullptr)
+    dll_name = win32_add_dll (event->lpBaseOfDll);
+#endif
+  if (dll_name == nullptr)
     return;
 
   win32_add_one_solib (dll_name, (CORE_ADDR) (uintptr_t) event->lpBaseOfDll);

  reply	other threads:[~2021-04-10 18:07 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-10 12:36 Eli Zaretskii via Gdb-patches
2021-03-10 16:30 ` Hannes Domani via Gdb-patches
2021-03-10 16:51   ` Eli Zaretskii via Gdb-patches
2021-03-10 17:35     ` Hannes Domani via Gdb-patches
2021-04-05 17:51       ` Eli Zaretskii via Gdb-patches
2021-04-06 13:16         ` Eli Zaretskii via Gdb-patches
2021-04-07 21:18           ` Simon Marchi via Gdb-patches
2021-04-08  7:06             ` Eli Zaretskii via Gdb-patches
2021-04-08 13:57               ` Simon Marchi via Gdb-patches
2021-04-10  8:46                 ` Eli Zaretskii via Gdb-patches
2021-04-10 15:03           ` Tom Tromey
2021-04-10 18:07             ` Eli Zaretskii via Gdb-patches [this message]
2021-04-10 22:56               ` Simon Marchi via Gdb-patches
2021-04-10 23:11                 ` Simon Marchi via Gdb-patches
2021-04-11  7:10                 ` Eli Zaretskii via Gdb-patches
2021-04-11 12:27                   ` Simon Marchi via Gdb-patches
2021-04-11 18:43                     ` Eli Zaretskii via Gdb-patches
2021-04-12 19:03                       ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=834kge57z0.fsf@gnu.org \
    --to=gdb-patches@sourceware.org \
    --cc=eliz@gnu.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox