[5/5] Add handling for 64-bit module addresses in Cygwin core dumps

Message ID 20200712125542.1322-6-jon.turney@dronecode.org.uk
State Superseded
Headers show
Series
  • bfd: Add support for Cygwin x86_64 core dumps (v2)
Related show

Commit Message

Jon Turney July 12, 2020, 12:55 p.m.
bfd/ChangeLog:

2020-07-01  Jon Turney  <jon.turney@dronecode.org.uk>

	* elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64.
---
 bfd/ChangeLog |  4 ++++
 bfd/elf.c     | 32 ++++++++++++++++++++++++--------
 2 files changed, 28 insertions(+), 8 deletions(-)

-- 
2.27.0

Patch

diff --git a/bfd/elf.c b/bfd/elf.c
index b05d0d6c2db..21de5df8ffe 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 TRUE;
-
+    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 TRUE;
+
+          /* 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
+        {
+          if (note->descsz < 16)
+            return TRUE;
+
+          /* 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 TRUE;