diff options
author | Tom Tromey <tromey@adacore.com> | 2021-04-30 10:22:23 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2021-04-30 10:22:24 -0600 |
commit | e228ef975e92d3bc860fc6b87039447392ba53aa (patch) | |
tree | a42a01934906c6be7a513b6abf370cb34f21620c /gdbserver | |
parent | de0718729053b7c558166f3cc1a7d170c48a25de (diff) | |
download | gdb-e228ef975e92d3bc860fc6b87039447392ba53aa.zip gdb-e228ef975e92d3bc860fc6b87039447392ba53aa.tar.gz gdb-e228ef975e92d3bc860fc6b87039447392ba53aa.tar.bz2 |
Share DLL code between gdb and gdbserver
This moves the new DLL-loading code into nat/windows-nat.c, and
changes both gdb and gdbserver to use the shared code. One
client-provided callback, handle_load_dll, is changed to allow the
code to be shared. This callback was actually never called from
nat/windows-nat.c; maybe I had planned to share more here and then
didn't finish... I'm not sure.
gdb/ChangeLog
2021-04-30 Tom Tromey <tromey@adacore.com>
* windows-nat.c (windows_nat::handle_load_dll): Update.
(windows_nat_target::get_windows_debug_event): Call
dll_loaded_event.
(windows_add_all_dlls, windows_add_dll): Move to
nat/windows-nat.c.
* nat/windows-nat.h (handle_load_dll): Change parameters.
(dll_loaded_event, windows_add_all_dlls): Declare.
* nat/windows-nat.c (windows_add_dll, windows_add_all_dlls): Move
from windows-nat.c.
(dll_loaded_event): New function.
gdbserver/ChangeLog
2021-04-30 Tom Tromey <tromey@adacore.com>
* win32-low.cc (do_initial_child_stuff): Update.
(windows_nat::handle_load_dll): Rename from win32_add_one_solib.
Change parameter type.
(win32_add_dll, win32_add_all_dlls)
(windows_nat::handle_load_dll): Remove.
(get_child_debug_event): Call dll_loaded_event.
Diffstat (limited to 'gdbserver')
-rw-r--r-- | gdbserver/ChangeLog | 9 | ||||
-rw-r--r-- | gdbserver/win32-low.cc | 170 |
2 files changed, 17 insertions, 162 deletions
diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index 86e87c5..057ed15 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,5 +1,14 @@ 2021-04-30 Tom Tromey <tromey@adacore.com> + * win32-low.cc (do_initial_child_stuff): Update. + (windows_nat::handle_load_dll): Rename from win32_add_one_solib. + Change parameter type. + (win32_add_dll, win32_add_all_dlls) + (windows_nat::handle_load_dll): Remove. + (get_child_debug_event): Call dll_loaded_event. + +2021-04-30 Tom Tromey <tromey@adacore.com> + * win32-low.cc (GETPROCADDRESS): Remove. (winapi_DebugActiveProcessStop, winapi_DebugSetProcessKillOnExit) (winapi_DebugBreakProcess, winapi_GenerateConsoleCtrlEvent) diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index d742ecd..5c7946b 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -90,8 +90,6 @@ const struct target_desc *wow64_win32_tdesc; #define NUM_REGS (the_low_target.num_regs ()) -static void win32_add_all_dlls (void); - /* Get the thread ID from the current selected inferior (the current thread). */ static ptid_t @@ -419,7 +417,7 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached) Rather than try to work around this sort of issue, it is much simpler to just ignore DLL load/unload events during the startup phase, and then process them all in one batch now. */ - win32_add_all_dlls (); + windows_add_all_dlls (); child_initialization_done = 1; } @@ -937,9 +935,13 @@ win32_process_target::resume (thread_resume *resume_info, size_t n) child_continue (continue_status, tid); } -static void -win32_add_one_solib (const char *name, CORE_ADDR load_addr) +/* See nat/windows-nat.h. */ + +void +windows_nat::handle_load_dll (const char *name, LPVOID base) { + CORE_ADDR load_addr = (CORE_ADDR) (uintptr_t) base; + char buf[MAX_PATH + 1]; char buf2[MAX_PATH + 1]; @@ -987,162 +989,6 @@ win32_add_one_solib (const char *name, CORE_ADDR load_addr) loaded_dll (buf2, load_addr); } -/* 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 char * -win32_add_dll (LPVOID load_addr) -{ - size_t i; - HMODULE dh_buf[1]; - HMODULE *DllHandle = dh_buf; - DWORD cbNeeded; - BOOL ok; - - cbNeeded = 0; -#ifdef __x86_64__ - if (wow64_process) - ok = EnumProcessModulesEx (current_process_handle, - DllHandle, - sizeof (HMODULE), - &cbNeeded, - LIST_MODULES_32BIT); - else -#endif - ok = EnumProcessModules (current_process_handle, - DllHandle, - sizeof (HMODULE), - &cbNeeded); - - if (!ok || !cbNeeded) - return NULL; - - DllHandle = (HMODULE *) alloca (cbNeeded); - if (!DllHandle) - return NULL; - -#ifdef __x86_64__ - if (wow64_process) - ok = EnumProcessModulesEx (current_process_handle, - DllHandle, - cbNeeded, - &cbNeeded, - LIST_MODULES_32BIT); - else -#endif - ok = EnumProcessModules (current_process_handle, - DllHandle, - cbNeeded, - &cbNeeded); - if (!ok) - return NULL; - - char system_dir[MAX_PATH]; - char syswow_dir[MAX_PATH]; - size_t system_dir_len = 0; - bool convert_syswow_dir = false; -#ifdef __x86_64__ - if (wow64_process) -#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 < ((size_t) cbNeeded / sizeof (HMODULE)); i++) - { - MODULEINFO mi; - static char dll_name[MAX_PATH]; - - if (!GetModuleInformation (current_process_handle, - DllHandle[i], - &mi, - sizeof (mi))) - continue; - if (GetModuleFileNameExA (current_process_handle, - DllHandle[i], - dll_name, - 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 - 32bit syswow64 directory if necessary. */ - std::string syswow_dll_path; - if (convert_syswow_dir - && strncasecmp (dll_name, system_dir, system_dir_len) == 0 - && strchr (dll_name + system_dir_len, '\\') == nullptr) - { - syswow_dll_path = syswow_dir; - syswow_dll_path += dll_name + system_dir_len; - name = syswow_dll_path.c_str(); - } - - if (load_addr != nullptr) - { - if (name != dll_name) - strcpy (dll_name, name); - return dll_name; - } - else - win32_add_one_solib (name, (CORE_ADDR) (uintptr_t) mi.lpBaseOfDll); - } - return NULL; -} - -/* 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); -} - -/* See nat/windows-nat.h. */ - -void -windows_nat::handle_load_dll () -{ - LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll; - const char *dll_name; - - dll_name = get_image_name (current_process_handle, - event->lpImageName, event->fUnicode); - if (dll_name == nullptr - && event->lpBaseOfDll != nullptr) - dll_name = win32_add_dll (event->lpBaseOfDll); - if (dll_name == nullptr) - return; - - win32_add_one_solib (dll_name, (CORE_ADDR) (uintptr_t) event->lpBaseOfDll); -} - /* See nat/windows-nat.h. */ void @@ -1367,7 +1213,7 @@ get_child_debug_event (DWORD *continue_status, CloseHandle (current_event.u.LoadDll.hFile); if (! child_initialization_done) break; - handle_load_dll (); + dll_loaded_event (); ourstatus->kind = TARGET_WAITKIND_LOADED; ourstatus->value.sig = GDB_SIGNAL_TRAP; |