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
#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;

View File

@ -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);