diff --git a/winsup/cygwin/include/cygwin/core_dump.h b/winsup/cygwin/include/cygwin/core_dump.h index 92ecae7ab..cd218ac45 100644 --- a/winsup/cygwin/include/cygwin/core_dump.h +++ b/winsup/cygwin/include/cygwin/core_dump.h @@ -11,17 +11,23 @@ details. */ #ifndef _CYGWIN_CORE_DUMP_H #define _CYGWIN_CORE_DUMP_H +/* + Note that elfcore_grok_win32pstatus() in libbfd relies on the precise layout + of these structures. +*/ + #include #define NOTE_INFO_PROCESS 1 #define NOTE_INFO_THREAD 2 #define NOTE_INFO_MODULE 3 +#define NOTE_INFO_MODULE64 4 struct win32_core_process_info { DWORD pid; - int signal; - int command_line_size; + DWORD signal; + DWORD command_line_size; char command_line[1]; } #ifdef __GNUC__ @@ -40,10 +46,12 @@ struct win32_core_thread_info #endif ; +/* Used with data_type NOTE_INFO_MODULE or NOTE_INFO_MODULE64, depending on + arch */ struct win32_core_module_info { void* base_address; - int module_name_size; + DWORD module_name_size; char module_name[1]; } #ifdef __GNUC__ @@ -53,7 +61,7 @@ struct win32_core_module_info struct win32_pstatus { - unsigned long data_type; + DWORD data_type; union { struct win32_core_process_info process_info; diff --git a/winsup/utils/dumper.cc b/winsup/utils/dumper.cc index e16d80a36..dcf01e800 100644 --- a/winsup/utils/dumper.cc +++ b/winsup/utils/dumper.cc @@ -502,7 +502,11 @@ dumper::dump_module (asection * to, process_module * module) strncpy (header.elf_note_header.name, "win32module", NOTE_NAME_SIZE); #pragma GCC diagnostic pop +#ifdef __x86_64__ + module_pstatus_ptr->data_type = NOTE_INFO_MODULE64; +#else module_pstatus_ptr->data_type = NOTE_INFO_MODULE; +#endif module_pstatus_ptr->data.module_info.base_address = module->base_address; module_pstatus_ptr->data.module_info.module_name_size = strlen (module->name) + 1; strcpy (module_pstatus_ptr->data.module_info.module_name, module->name);