mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
Share get_image_name between gdb and gdbserver
This moves get_image_name to nat/windows-nat.c so that it can be shared between gdb and gdbserver. gdb/ChangeLog 2020-04-08 Tom Tromey <tromey@adacore.com> * windows-nat.c (get_image_name): Move to nat/windows-nat.c. (handle_load_dll): Update. * nat/windows-nat.c (get_image_name): Move from windows-nat.c. gdbserver/ChangeLog 2020-04-08 Tom Tromey <tromey@adacore.com> * win32-low.c (get_image_name): Remove. (handle_load_dll): Update.
This commit is contained in:
parent
28688adf8f
commit
9d8679cc71
@ -1,3 +1,9 @@
|
||||
2020-04-08 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* windows-nat.c (get_image_name): Move to nat/windows-nat.c.
|
||||
(handle_load_dll): Update.
|
||||
* nat/windows-nat.c (get_image_name): Move from windows-nat.c.
|
||||
|
||||
2020-04-08 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* windows-nat.c (enum thread_disposition_type): Move to
|
||||
|
@ -69,4 +69,61 @@ windows_thread_info::resume ()
|
||||
suspended = 0;
|
||||
}
|
||||
|
||||
const char *
|
||||
get_image_name (HANDLE h, void *address, int unicode)
|
||||
{
|
||||
#ifdef __CYGWIN__
|
||||
static char buf[MAX_PATH];
|
||||
#else
|
||||
static char buf[(2 * MAX_PATH) + 1];
|
||||
#endif
|
||||
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
|
||||
char *address_ptr;
|
||||
int len = 0;
|
||||
char b[2];
|
||||
SIZE_T done;
|
||||
|
||||
/* Attempt to read the name of the dll that was detected.
|
||||
This is documented to work only when actively debugging
|
||||
a program. It will not work for attached processes. */
|
||||
if (address == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
/* Windows CE reports the address of the image name,
|
||||
instead of an address of a pointer into the image name. */
|
||||
address_ptr = address;
|
||||
#else
|
||||
/* See if we could read the address of a string, and that the
|
||||
address isn't null. */
|
||||
if (!ReadProcessMemory (h, address, &address_ptr,
|
||||
sizeof (address_ptr), &done)
|
||||
|| done != sizeof (address_ptr)
|
||||
|| !address_ptr)
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
/* Find the length of the string. */
|
||||
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
|
||||
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
|
||||
continue;
|
||||
|
||||
if (!unicode)
|
||||
ReadProcessMemory (h, address_ptr, buf, len, &done);
|
||||
else
|
||||
{
|
||||
WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
|
||||
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
|
||||
&done);
|
||||
#ifdef __CYGWIN__
|
||||
wcstombs (buf, unicode_address, MAX_PATH);
|
||||
#else
|
||||
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
|
||||
0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -111,6 +111,13 @@ enum thread_disposition_type
|
||||
extern windows_thread_info *thread_rec (ptid_t ptid,
|
||||
thread_disposition_type disposition);
|
||||
|
||||
/* Return the name of the DLL referenced by H at ADDRESS. UNICODE
|
||||
determines what sort of string is read from the inferior. Returns
|
||||
the name of the DLL, or NULL on error. If a name is returned, it
|
||||
is stored in a static buffer which is valid until the next call to
|
||||
get_image_name. */
|
||||
extern const char *get_image_name (HANDLE h, void *address, int unicode);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -921,56 +921,6 @@ windows_make_so (const char *name, LPVOID load_addr)
|
||||
return so;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_image_name (HANDLE h, void *address, int unicode)
|
||||
{
|
||||
#ifdef __CYGWIN__
|
||||
static char buf[__PMAX];
|
||||
#else
|
||||
static char buf[(2 * __PMAX) + 1];
|
||||
#endif
|
||||
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
|
||||
char *address_ptr;
|
||||
int len = 0;
|
||||
char b[2];
|
||||
SIZE_T done;
|
||||
|
||||
/* Attempt to read the name of the dll that was detected.
|
||||
This is documented to work only when actively debugging
|
||||
a program. It will not work for attached processes. */
|
||||
if (address == NULL)
|
||||
return NULL;
|
||||
|
||||
/* See if we could read the address of a string, and that the
|
||||
address isn't null. */
|
||||
if (!ReadProcessMemory (h, address, &address_ptr,
|
||||
sizeof (address_ptr), &done)
|
||||
|| done != sizeof (address_ptr) || !address_ptr)
|
||||
return NULL;
|
||||
|
||||
/* Find the length of the string. */
|
||||
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
|
||||
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
|
||||
continue;
|
||||
|
||||
if (!unicode)
|
||||
ReadProcessMemory (h, address_ptr, buf, len, &done);
|
||||
else
|
||||
{
|
||||
WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
|
||||
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
|
||||
&done);
|
||||
#ifdef __CYGWIN__
|
||||
wcstombs (buf, unicode_address, __PMAX);
|
||||
#else
|
||||
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
|
||||
0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* Handle a DLL load event, and return 1.
|
||||
|
||||
This function assumes that this event did not occur during inferior
|
||||
@ -982,7 +932,7 @@ static void
|
||||
handle_load_dll ()
|
||||
{
|
||||
LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll;
|
||||
char *dll_name;
|
||||
const char *dll_name;
|
||||
|
||||
/* Try getting the DLL name via the lpImageName field of the event.
|
||||
Note that Microsoft documents this fields as strictly optional,
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-04-08 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* win32-low.c (get_image_name): Remove.
|
||||
(handle_load_dll): Update.
|
||||
|
||||
2020-04-08 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* win32-low.c (windows_nat::thread_rec): Rename from thread_rec.
|
||||
|
@ -1031,55 +1031,6 @@ win32_add_one_solib (const char *name, CORE_ADDR load_addr)
|
||||
loaded_dll (buf2, load_addr);
|
||||
}
|
||||
|
||||
static char *
|
||||
get_image_name (HANDLE h, void *address, int unicode)
|
||||
{
|
||||
static char buf[(2 * MAX_PATH) + 1];
|
||||
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
|
||||
char *address_ptr;
|
||||
int len = 0;
|
||||
char b[2];
|
||||
SIZE_T done;
|
||||
|
||||
/* Attempt to read the name of the dll that was detected.
|
||||
This is documented to work only when actively debugging
|
||||
a program. It will not work for attached processes. */
|
||||
if (address == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
/* Windows CE reports the address of the image name,
|
||||
instead of an address of a pointer into the image name. */
|
||||
address_ptr = address;
|
||||
#else
|
||||
/* See if we could read the address of a string, and that the
|
||||
address isn't null. */
|
||||
if (!ReadProcessMemory (h, address, &address_ptr,
|
||||
sizeof (address_ptr), &done)
|
||||
|| done != sizeof (address_ptr)
|
||||
|| !address_ptr)
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
/* Find the length of the string */
|
||||
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
|
||||
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
|
||||
continue;
|
||||
|
||||
if (!unicode)
|
||||
ReadProcessMemory (h, address_ptr, buf, len, &done);
|
||||
else
|
||||
{
|
||||
WCHAR *unicode_address = XALLOCAVEC (WCHAR, len);
|
||||
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
|
||||
&done);
|
||||
|
||||
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *,
|
||||
DWORD, LPDWORD);
|
||||
typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE,
|
||||
@ -1188,7 +1139,7 @@ static void
|
||||
handle_load_dll (void)
|
||||
{
|
||||
LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll;
|
||||
char *dll_name;
|
||||
const char *dll_name;
|
||||
|
||||
dll_name = get_image_name (current_process_handle,
|
||||
event->lpImageName, event->fUnicode);
|
||||
|
Loading…
Reference in New Issue
Block a user