Cygwin: Add a new win32_pstatus data type for modules on x86_64
Also 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.
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user