X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fwindows-nat.c;h=601f28bf1294b0e140574aa5ca516c5fa621a4ca;hb=8387904def5e1510b39abce755c964c1b3f52307;hp=d6bb27ec533b59ccbad412e7d2763222a1f7b0dc;hpb=baa93fa6f9249a1edc8c0fc10d8425ea964cb795;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index d6bb27ec53..601f28bf12 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -1,7 +1,7 @@ /* Target-vector operations for controlling win32 child processes, for GDB. - Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free - Software Foundation, Inc. + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. Contributed by Cygnus Solutions, A Red Hat Company. @@ -27,7 +27,6 @@ /* We assume we're being built with and will be used for cygwin. */ #include "defs.h" -#include "tm.h" /* required for SSE registers */ #include "frame.h" /* required by inferior.h */ #include "inferior.h" #include "target.h" @@ -36,7 +35,6 @@ #include "completer.h" #include "regcache.h" #include "top.h" -#include "i386-tdep.h" #include #include #include @@ -53,9 +51,10 @@ #include "gdbcmd.h" #include #include +#include "exec.h" -/* The ui's event loop. */ -extern int (*ui_loop_hook) (int signo); +#include "i386-tdep.h" +#include "i387-tdep.h" /* If we're not using the old Cygwin header file set, define the following which never should have been in the generic Win32 API @@ -70,16 +69,12 @@ enum #include #include -#ifdef HAVE_SSE_REGS #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \ | CONTEXT_EXTENDED_REGISTERS -#else -#define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS -#endif static unsigned dr[8]; -static int debug_registers_changed = 0; -static int debug_registers_used = 0; +static int debug_registers_changed; +static int debug_registers_used; /* The string sent by cygwin when it processes a signal. FIXME: This should be in a cygwin include file. */ @@ -110,6 +105,7 @@ typedef struct thread_info_struct HANDLE h; char *name; int suspend_count; + int reload_context; CONTEXT context; STACKFRAME sf; } @@ -187,7 +183,6 @@ static const int mappings[] = context_offset (FloatSave.DataSelector), context_offset (FloatSave.DataOffset), context_offset (FloatSave.ErrorSelector) -#ifdef HAVE_SSE_REGS /* XMM0-7 */ , context_offset (ExtendedRegisters[10*16]), context_offset (ExtendedRegisters[11*16]), @@ -199,7 +194,6 @@ static const int mappings[] = context_offset (ExtendedRegisters[17*16]), /* MXCSR */ context_offset (ExtendedRegisters[24]) -#endif }; #undef context_offset @@ -232,7 +226,6 @@ check (BOOL ok, const char *file, int line) GetLastError ()); } - /* Find a thread record given a thread id. If get_context then also retrieve the context for this thread. */ @@ -250,19 +243,7 @@ thread_rec (DWORD id, int get_context) th->suspend_count = SuspendThread (th->h) + 1; else if (get_context < 0) th->suspend_count = -1; - - th->context.ContextFlags = CONTEXT_DEBUGGER_DR; - GetThreadContext (th->h, &th->context); - if (id == current_event.dwThreadId) - { - /* Copy dr values from that thread. */ - dr[0] = th->context.Dr0; - dr[1] = th->context.Dr1; - dr[2] = th->context.Dr2; - dr[3] = th->context.Dr3; - dr[6] = th->context.Dr6; - dr[7] = th->context.Dr7; - } + th->reload_context = 1; } return th; } @@ -352,37 +333,67 @@ do_child_fetch_inferior_registers (int r) { char *context_offset = ((char *) ¤t_thread->context) + mappings[r]; long l; - if (r == FCS_REGNUM) + + if (!current_thread) + return; /* Windows sometimes uses a non-existent thread id in its + events */ + + if (current_thread->reload_context) + { + thread_info *th = current_thread; + th->context.ContextFlags = CONTEXT_DEBUGGER_DR; + GetThreadContext (th->h, &th->context); + /* Copy dr values from that thread. */ + dr[0] = th->context.Dr0; + dr[1] = th->context.Dr1; + dr[2] = th->context.Dr2; + dr[3] = th->context.Dr3; + dr[6] = th->context.Dr6; + dr[7] = th->context.Dr7; + current_thread->reload_context = 0; + } + +#define I387_ST0_REGNUM I386_ST0_REGNUM + + if (r == I387_FISEG_REGNUM) { l = *((long *) context_offset) & 0xffff; - supply_register (r, (char *) &l); + regcache_raw_supply (current_regcache, r, (char *) &l); } - else if (r == FOP_REGNUM) + else if (r == I387_FOP_REGNUM) { l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1); - supply_register (r, (char *) &l); + regcache_raw_supply (current_regcache, r, (char *) &l); } else if (r >= 0) - supply_register (r, context_offset); + regcache_raw_supply (current_regcache, r, context_offset); else { for (r = 0; r < NUM_REGS; r++) do_child_fetch_inferior_registers (r); } + +#undef I387_ST0_REGNUM } static void child_fetch_inferior_registers (int r) { current_thread = thread_rec (PIDGET (inferior_ptid), TRUE); - do_child_fetch_inferior_registers (r); + /* Check if current_thread exists. Windows sometimes uses a non-existent + thread id in its events */ + if (current_thread) + do_child_fetch_inferior_registers (r); } static void do_child_store_inferior_registers (int r) { - if (r >= 0) - regcache_collect (r, ((char *) ¤t_thread->context) + mappings[r]); + if (!current_thread) + /* Windows sometimes uses a non-existent thread id in its events */; + else if (r >= 0) + regcache_raw_collect (current_regcache, r, + ((char *) ¤t_thread->context) + mappings[r]); else { for (r = 0; r < NUM_REGS; r++) @@ -395,7 +406,10 @@ static void child_store_inferior_registers (int r) { current_thread = thread_rec (PIDGET (inferior_ptid), TRUE); - do_child_store_inferior_registers (r); + /* Check if current_thread exists. Windows sometimes uses a non-existent + thread id in its events */ + if (current_thread) + do_child_store_inferior_registers (r); } static int psapi_loaded = 0; @@ -602,8 +616,8 @@ register_loaded_dll (const char *name, DWORD load_addr) so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (ppath) + 8 + 1); so->loaded = 0; so->load_addr = load_addr; - if (!VirtualQueryEx (current_process_handle, (void *) load_addr, &m, - sizeof (m))) + if (VirtualQueryEx (current_process_handle, (void *) load_addr, &m, + sizeof (m))) so->end_addr = (DWORD) m.AllocationBase + m.RegionSize; else so->end_addr = load_addr + 0x2000; /* completely arbitrary */ @@ -635,21 +649,16 @@ get_image_name (HANDLE h, void *address, int unicode) if (address == NULL) return NULL; - ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done); - /* See if we could read the address of a string, and that the address isn't null. */ - - if (done != sizeof (address_ptr) || !address_ptr) + if (!ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done) + || done != sizeof (address_ptr) || !address_ptr) return NULL; /* Find the length of the string */ - do - { - ReadProcessMemory (h, address_ptr + len * size, &b, size, &done); - len++; - } - while ((b[0] != 0 || b[size - 1] != 0) && done == size); + 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); @@ -750,11 +759,66 @@ child_clear_solibs (void) max_dll_name_len = sizeof ("DLL Name") - 1; } +/* Get the loaded address of all sections, given that .text was loaded + at text_load. Assumes that all sections are subject to the same + relocation offset. Returns NULL if problems occur or if the + sections were not relocated. */ + +static struct section_addr_info * +get_relocated_section_addrs (bfd *abfd, CORE_ADDR text_load) +{ + struct section_addr_info *result = NULL; + int section_count = bfd_count_sections (abfd); + asection *text_section = bfd_get_section_by_name (abfd, ".text"); + CORE_ADDR text_vma; + + if (!text_section) + { + /* Couldn't get the .text section. Weird. */ + } + + else if (text_load == (text_vma = bfd_get_section_vma (abfd, text_section))) + { + /* DLL wasn't relocated. */ + } + + else + { + /* Figure out all sections' loaded addresses. The offset here is + such that taking a bfd_get_section_vma() result and adding + offset will give the real load address of the section. */ + + CORE_ADDR offset = text_load - text_vma; + + struct section_table *table_start = NULL; + struct section_table *table_end = NULL; + struct section_table *iter = NULL; + + build_section_table (abfd, &table_start, &table_end); + + for (iter = table_start; iter < table_end; ++iter) + { + /* Relocated addresses. */ + iter->addr += offset; + iter->endaddr += offset; + } + + result = build_section_addr_info_from_section_table (table_start, + table_end); + + xfree (table_start); + } + + return result; +} + /* Add DLL symbol information. */ static struct objfile * solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr) { - struct section_addr_info section_addrs; + struct section_addr_info *addrs = NULL; + static struct objfile *result = NULL; + bfd *abfd = NULL; /* The symbols in a dll are offset by 0x1000, which is the the offset from 0 of the first byte in an image - because @@ -763,10 +827,44 @@ solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr) if (!name || !name[0]) return NULL; - memset (§ion_addrs, 0, sizeof (section_addrs)); - section_addrs.other[0].name = ".text"; - section_addrs.other[0].addr = load_addr; - return safe_symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED); + abfd = bfd_openr (name, "pei-i386"); + + if (!abfd) + { + /* pei failed - try pe */ + abfd = bfd_openr (name, "pe-i386"); + } + + if (abfd) + { + if (bfd_check_format (abfd, bfd_object)) + { + addrs = get_relocated_section_addrs (abfd, load_addr); + } + + bfd_close (abfd); + } + + if (addrs) + { + result = safe_symbol_file_add (name, from_tty, addrs, 0, OBJF_SHARED); + free_section_addr_info (addrs); + } + else + { + /* Fallback on handling just the .text section. */ + struct cleanup *my_cleanups; + + addrs = alloc_section_addr_info (1); + my_cleanups = make_cleanup (xfree, addrs); + addrs->other[0].name = ".text"; + addrs->other[0].addr = load_addr; + + result = safe_symbol_file_add (name, from_tty, addrs, 0, OBJF_SHARED); + do_cleanups (my_cleanups); + } + + return result; } /* Load DLL symbol info. */ @@ -858,7 +956,7 @@ display_selector (HANDLE thread, DWORD sel) + info.BaseLow; limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow; if (info.HighWord.Bits.Granularity) - limit = (limit << 12) | 0xfff; + limit = (limit << 12) | 0xfff; printf_filtered ("base=0x%08x limit=0x%08x", base, limit); if (info.HighWord.Bits.Default_Big) puts_filtered(" 32-bit "); @@ -1094,7 +1192,7 @@ child_continue (DWORD continue_status, int id) th->suspend_count = 0; if (debug_registers_changed) { - /* Only change the value of the debug reisters */ + /* Only change the value of the debug registers */ th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS; th->context.Dr0 = dr[0]; th->context.Dr1 = dr[1]; @@ -1112,6 +1210,19 @@ child_continue (DWORD continue_status, int id) return res; } +/* Called in pathological case where Windows fails to send a + CREATE_PROCESS_DEBUG_EVENT after an attach. */ +DWORD +fake_create_process (void) +{ + current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE, + current_event.dwProcessId); + main_thread_id = current_event.dwThreadId; + current_thread = child_add_thread (main_thread_id, + current_event.u.CreateThread.hThread); + return main_thread_id; +} + /* Get the next event from the child. Return 1 if the event requires handling by WFI (or whatever). */ @@ -1120,7 +1231,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) { BOOL debug_event; DWORD continue_status, event_code; - thread_info *th = NULL; + thread_info *th; static thread_info dummy_thread_info; int retval = 0; @@ -1134,6 +1245,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) event_code = current_event.dwDebugEventCode; ourstatus->kind = TARGET_WAITKIND_SPURIOUS; + th = NULL; switch (event_code) { @@ -1143,7 +1255,17 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) (unsigned) current_event.dwThreadId, "CREATE_THREAD_DEBUG_EVENT")); if (saw_create != 1) - break; + { + if (!saw_create && attach_flag) + { + /* Kludge around a Windows bug where first event is a create + thread event. Caused when attached process does not have + a main thread. */ + retval = ourstatus->value.related_pid = fake_create_process (); + saw_create++; + } + break; + } /* Record the existence of this thread */ th = child_add_thread (current_event.dwThreadId, current_event.u.CreateThread.hThread); @@ -1159,10 +1281,11 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) (unsigned) current_event.dwProcessId, (unsigned) current_event.dwThreadId, "EXIT_THREAD_DEBUG_EVENT")); - if (saw_create != 1) - break; - child_delete_thread (current_event.dwThreadId); - th = &dummy_thread_info; + if (current_event.dwThreadId != main_thread_id) + { + child_delete_thread (current_event.dwThreadId); + th = &dummy_thread_info; + } break; case CREATE_PROCESS_DEBUG_EVENT: @@ -1178,12 +1301,10 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) } current_process_handle = current_event.u.CreateProcessInfo.hProcess; + if (main_thread_id) + child_delete_thread (main_thread_id); main_thread_id = current_event.dwThreadId; /* Add the main thread */ -#if 0 - th = child_add_thread (current_event.dwProcessId, - current_event.u.CreateProcessInfo.hProcess); -#endif th = child_add_thread (main_thread_id, current_event.u.CreateProcessInfo.hThread); retval = ourstatus->value.related_pid = current_event.dwThreadId; @@ -1268,8 +1389,8 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) CHECK (child_continue (continue_status, -1)); else { - current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE); inferior_ptid = pid_to_ptid (retval); + current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE); } out: @@ -1297,8 +1418,8 @@ child_wait (ptid_t ptid, struct target_waitstatus *ourstatus) { int detach = 0; - if (ui_loop_hook != NULL) - detach = ui_loop_hook (0); + if (deprecated_ui_loop_hook != NULL) + detach = deprecated_ui_loop_hook (0); if (detach) child_kill_inferior (); @@ -1410,12 +1531,12 @@ set_process_privilege (const char *privilege, BOOL enable) AdjustTokenPrivileges = GetProcAddress (advapi32, "AdjustTokenPrivileges"); if (!OpenProcessToken || !LookupPrivilegeValue || !AdjustTokenPrivileges) - { + { advapi32 = NULL; goto out; } } - + if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &token_hdl)) @@ -1429,7 +1550,7 @@ set_process_privilege (const char *privilege, BOOL enable) new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0; if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv, - sizeof orig_priv, &orig_priv, &size)) + sizeof orig_priv, &orig_priv, &size)) goto out; #if 0 /* Disabled, otherwise every `attach' in an unprivileged user session @@ -1480,14 +1601,13 @@ child_attach (char *args, int from_tty) ok = DebugActiveProcess (pid); if (!ok) - error ("Can't attach to process."); + error ("Can't attach to process."); } if (has_detach_ability ()) - { - attach_flag = 1; - DebugSetProcessKillOnExit (FALSE); - } + DebugSetProcessKillOnExit (FALSE); + + attach_flag = 1; if (from_tty) { @@ -1537,6 +1657,36 @@ child_detach (char *args, int from_tty) unpush_target (&child_ops); } +char * +child_pid_to_exec_file (int pid) +{ + /* Try to find the process path using the Cygwin internal process list + pid isn't a valid pid, unfortunately. Use current_event.dwProcessId + instead. */ + /* TODO: Also find native Windows processes using CW_GETPINFO_FULL. */ + + static char path[MAX_PATH + 1]; + char *path_ptr = NULL; + int cpid; + struct external_pinfo *pinfo; + + cygwin_internal (CW_LOCK_PINFO, 1000); + for (cpid = 0; + (pinfo = (struct external_pinfo *) + cygwin_internal (CW_GETPINFO, cpid | CW_NEXTPID)); + cpid = pinfo->pid) + { + if (pinfo->dwProcessId == current_event.dwProcessId) /* Got it */ + { + cygwin_conv_to_full_posix_path (pinfo->progname, path); + path_ptr = path; + break; + } + } + cygwin_internal (CW_UNLOCK_PINFO); + return path_ptr; +} + /* Print status information about what we're accessing. */ static void @@ -1546,7 +1696,6 @@ child_files_info (struct target_ops *ignore) attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid)); } -/* ARGSUSED */ static void child_open (char *arg, int from_tty) { @@ -1559,7 +1708,8 @@ child_open (char *arg, int from_tty) ENV is the environment vector to pass. Errors reported with error(). */ static void -child_create_inferior (char *exec_file, char *allargs, char **env) +child_create_inferior (char *exec_file, char *allargs, char **env, + int from_tty) { char *winenv; char *temp; @@ -1610,6 +1760,8 @@ child_create_inferior (char *exec_file, char *allargs, char **env) if (new_console) flags |= CREATE_NEW_CONSOLE; + attach_flag = 0; + args = alloca (strlen (toexec) + strlen (allargs) + 2); strcpy (args, toexec); strcat (args, " "); @@ -1772,21 +1924,23 @@ child_xfer_memory (CORE_ADDR memaddr, char *our, int len, int write, struct mem_attrib *mem, struct target_ops *target) { - DWORD done; + DWORD done = 0; if (write) { DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n", len, (DWORD) memaddr)); - WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our, - len, &done); + if (!WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our, + len, &done)) + done = 0; FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len); } else { DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n", len, (DWORD) memaddr)); - ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, len, - &done); + if (!ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, + len, &done)) + done = 0; } return done; } @@ -1809,7 +1963,8 @@ child_kill_inferior (void) CHECK (CloseHandle (current_process_handle)); /* this may fail in an attached process so don't check. */ - (void) CloseHandle (current_thread->h); + if (current_thread && current_thread->h) + (void) CloseHandle (current_thread->h); target_mourn_inferior (); /* or just child_mourn_inferior? */ } @@ -1873,16 +2028,16 @@ child_resume (ptid_t ptid, int step, enum target_signal sig) if (th->context.ContextFlags) { - if (debug_registers_changed) - { - th->context.Dr0 = dr[0]; - th->context.Dr1 = dr[1]; - th->context.Dr2 = dr[2]; - th->context.Dr3 = dr[3]; - /* th->context.Dr6 = dr[6]; - FIXME: should we set dr6 also ?? */ - th->context.Dr7 = dr[7]; - } + if (debug_registers_changed) + { + th->context.Dr0 = dr[0]; + th->context.Dr1 = dr[1]; + th->context.Dr2 = dr[2]; + th->context.Dr3 = dr[3]; + /* th->context.Dr6 = dr[6]; + FIXME: should we set dr6 also ?? */ + th->context.Dr7 = dr[7]; + } CHECK (SetThreadContext (th->h, &th->context)); th->context.ContextFlags = 0; } @@ -1954,6 +2109,7 @@ init_child_ops (void) child_ops.to_has_registers = 1; child_ops.to_has_execution = 1; child_ops.to_magic = OPS_MAGIC; + child_ops.to_pid_to_exec_file = child_pid_to_exec_file; } void @@ -1969,47 +2125,54 @@ _initialize_win32_nat (void) add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1); - add_show_from_set (add_set_cmd ("shell", class_support, var_boolean, - (char *) &useshell, - "Set use of shell to start subprocess.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean, - (char *) &new_console, - "Set creation of new console when creating child process.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean, - (char *) &new_group, - "Set creation of new group when creating child process.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean, - (char *) &debug_exec, - "Set whether to display execution in child process.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean, - (char *) &debug_events, - "Set whether to display kernel events in child process.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean, - (char *) &debug_memory, - "Set whether to display memory accesses in child process.", - &setlist), - &showlist); - - add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean, - (char *) &debug_exceptions, - "Set whether to display kernel exceptions in child process.", - &setlist), - &showlist); + deprecated_add_show_from_set + (add_set_cmd ("shell", class_support, var_boolean, + (char *) &useshell, + "Set use of shell to start subprocess.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("new-console", class_support, var_boolean, + (char *) &new_console, + "Set creation of new console when creating child process.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("new-group", class_support, var_boolean, + (char *) &new_group, + "Set creation of new group when creating child process.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("debugexec", class_support, var_boolean, + (char *) &debug_exec, + "Set whether to display execution in child process.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("debugevents", class_support, var_boolean, + (char *) &debug_events, + "Set whether to display kernel events in child process.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("debugmemory", class_support, var_boolean, + (char *) &debug_memory, + "Set whether to display memory accesses in child process.", + &setlist), + &showlist); + + deprecated_add_show_from_set + (add_set_cmd ("debugexceptions", class_support, var_boolean, + (char *) &debug_exceptions, + "Set whether to display kernel exceptions in child process.", + &setlist), + &showlist); add_info ("dll", info_dll_command, "Status of loaded DLLs."); add_info_alias ("sharedlibrary", "dll", 1); @@ -2061,7 +2224,6 @@ cygwin_get_dr6 (void) return dr[6]; } - /* Determine if the thread referenced by "pid" is alive by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0 it means that the pid has died. Otherwise it is assumed to be alive. */ @@ -2116,7 +2278,7 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr) register_loaded_dll (dll_name, base_addr + 0x1000); solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000); -out: + out: return 1; } @@ -2124,8 +2286,7 @@ typedef struct { struct target_ops *target; bfd_vma addr; -} -map_code_section_args; +} map_code_section_args; static void map_single_dll_code_section (bfd * abfd, asection * sect, void *obj) @@ -2215,20 +2376,20 @@ core_section_load_dll_symbols (bfd * abfd, asection * sect, void *obj) if (strncmp (sect->name, ".module", 7)) return; - buf = (char *) xmalloc (sect->_raw_size + 1); + buf = (char *) xmalloc (bfd_get_section_size (sect) + 1); if (!buf) { printf_unfiltered ("memory allocation failed for %s\n", sect->name); goto out; } - if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size)) + if (!bfd_get_section_contents (abfd, sect, buf, 0, bfd_get_section_size (sect))) goto out; pstatus = (struct win32_pstatus *) buf; memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr)); dll_name_size = pstatus->data.module_info.module_name_size; - if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size) + if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > bfd_get_section_size (sect)) goto out; dll_name = (char *) xmalloc (dll_name_size + 1); @@ -2288,7 +2449,7 @@ fetch_elf_core_registers (char *core_reg_sect, return; } for (r = 0; r < NUM_REGS; r++) - supply_register (r, core_reg_sect + mappings[r]); + regcache_raw_supply (current_regcache, r, core_reg_sect + mappings[r]); } static struct core_fns win32_elf_core_fns = @@ -2303,7 +2464,7 @@ static struct core_fns win32_elf_core_fns = void _initialize_core_win32 (void) { - add_core_fns (&win32_elf_core_fns); + deprecated_add_core_fns (&win32_elf_core_fns); } void