[PATCH 3/8] Cygwin: Add a new win32_pstatus data type for modules on x86_64

Jon Turney jon.turney@dronecode.org.uk
Wed Jul 1 21:25:24 GMT 2020


Take a bit more care with sizes in other data types to ensure they are
the same on x86 and x86_64.

Add some explanatory comments.
---
 winsup/cygwin/include/cygwin/core_dump.h | 16 ++++++++++++----
 winsup/utils/dumper.cc                   |  4 ++++
 2 files changed, 16 insertions(+), 4 deletions(-)

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 <windows.h>
 
 #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);
-- 
2.27.0



More information about the Cygwin-patches mailing list