From d61f3d038344734da3eb4b1cb085f387f8ad4ffa Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Mon, 29 Jun 2020 17:11:51 +0100 Subject: [PATCH] Add handling for 64-bit module addresses in Cygwin core dumps bfd/ChangeLog: 2020-07-01 Jon Turney * elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64. --- bfd/ChangeLog | 4 ++++ bfd/elf.c | 32 ++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9b4e74d214e..fe7fdbf6a25 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,7 @@ +2020-07-01 Jon Turney + + * elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64. + 2020-07-11 Jon Turney * elf.c (elfcore_grok_win32pstatus): Don't apply size constraint diff --git a/bfd/elf.c b/bfd/elf.c index 171880d6c2a..6fad516d462 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -10132,6 +10132,7 @@ elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note) #define NOTE_INFO_PROCESS 1 #define NOTE_INFO_THREAD 2 #define NOTE_INFO_MODULE 3 +#define NOTE_INFO_MODULE64 4 static bfd_boolean elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) @@ -10199,13 +10200,30 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) break; case NOTE_INFO_MODULE: - if (note->descsz < 12) - return FALSE; - + case NOTE_INFO_MODULE64: /* Make a ".module/xxxxxxxx" section. */ - /* module_info.base_address */ - base_addr = bfd_get_32 (abfd, note->descdata + 4); - sprintf (buf, ".module/%08lx", (unsigned long) base_addr); + if (type == NOTE_INFO_MODULE) + { + if (note->descsz < 12) + return FALSE; + + /* module_info.base_address */ + base_addr = bfd_get_32 (abfd, note->descdata + 4); + sprintf (buf, ".module/%08lx", (unsigned long) base_addr); + /* module_info.module_name_size */ + name_size = bfd_get_32 (abfd, note->descdata + 8); + } + else /* NOTE_INFO_MODULE64 */ + { + if (note->descsz < 16) + return FALSE; + + /* module_info.base_address */ + base_addr = bfd_get_64 (abfd, note->descdata + 4); + sprintf (buf, ".module/%016lx", (unsigned long) base_addr); + /* module_info.module_name_size */ + name_size = bfd_get_32 (abfd, note->descdata + 12); + } len = strlen (buf) + 1; name = (char *) bfd_alloc (abfd, len); @@ -10219,8 +10237,6 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) if (sect == NULL) return FALSE; - /* module_info.module_name_size */ - name_size = bfd_get_32 (abfd, note->descdata + 8); if (note->descsz < 12 + name_size) return FALSE; -- 2.30.2