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:
Jon Turney 2020-06-29 16:45:26 +01:00
parent 38f8860146
commit 7dd1b08836
No known key found for this signature in database
GPG Key ID: C7C86F0370285C81
2 changed files with 16 additions and 4 deletions

View File

@ -11,17 +11,23 @@ details. */
#ifndef _CYGWIN_CORE_DUMP_H #ifndef _CYGWIN_CORE_DUMP_H
#define _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> #include <windows.h>
#define NOTE_INFO_PROCESS 1 #define NOTE_INFO_PROCESS 1
#define NOTE_INFO_THREAD 2 #define NOTE_INFO_THREAD 2
#define NOTE_INFO_MODULE 3 #define NOTE_INFO_MODULE 3
#define NOTE_INFO_MODULE64 4
struct win32_core_process_info struct win32_core_process_info
{ {
DWORD pid; DWORD pid;
int signal; DWORD signal;
int command_line_size; DWORD command_line_size;
char command_line[1]; char command_line[1];
} }
#ifdef __GNUC__ #ifdef __GNUC__
@ -40,10 +46,12 @@ struct win32_core_thread_info
#endif #endif
; ;
/* Used with data_type NOTE_INFO_MODULE or NOTE_INFO_MODULE64, depending on
arch */
struct win32_core_module_info struct win32_core_module_info
{ {
void* base_address; void* base_address;
int module_name_size; DWORD module_name_size;
char module_name[1]; char module_name[1];
} }
#ifdef __GNUC__ #ifdef __GNUC__
@ -53,7 +61,7 @@ struct win32_core_module_info
struct win32_pstatus struct win32_pstatus
{ {
unsigned long data_type; DWORD data_type;
union union
{ {
struct win32_core_process_info process_info; struct win32_core_process_info process_info;

View File

@ -502,7 +502,11 @@ dumper::dump_module (asection * to, process_module * module)
strncpy (header.elf_note_header.name, "win32module", NOTE_NAME_SIZE); strncpy (header.elf_note_header.name, "win32module", NOTE_NAME_SIZE);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#ifdef __x86_64__
module_pstatus_ptr->data_type = NOTE_INFO_MODULE64;
#else
module_pstatus_ptr->data_type = NOTE_INFO_MODULE; 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.base_address = module->base_address;
module_pstatus_ptr->data.module_info.module_name_size = strlen (module->name) + 1; module_pstatus_ptr->data.module_info.module_name_size = strlen (module->name) + 1;
strcpy (module_pstatus_ptr->data.module_info.module_name, module->name); strcpy (module_pstatus_ptr->data.module_info.module_name, module->name);