Add handling for 64-bit module addresses in Cygwin core dumps
authorJon Turney <jon.turney@dronecode.org.uk>
Mon, 29 Jun 2020 16:11:51 +0000 (17:11 +0100)
committerJon Turney <jon.turney@dronecode.org.uk>
Wed, 12 Aug 2020 14:08:28 +0000 (15:08 +0100)
bfd/ChangeLog:

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

* elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64.

bfd/ChangeLog
bfd/elf.c

index 9b4e74d214e43713a5f2282f3c43f3319b4e1c2d..fe7fdbf6a25963797b5abdde49774bddae9739ed 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-01  Jon Turney  <jon.turney@dronecode.org.uk>
+
+       * elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64.
+
 2020-07-11  Jon Turney  <jon.turney@dronecode.org.uk>
 
        * elf.c (elfcore_grok_win32pstatus): Don't apply size constraint
index 171880d6c2a1f36b41bee0e53881b799733bace1..6fad516d4628c4051e7799c599d56af437e8dfef 100644 (file)
--- 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;