bfd/binutils: support for gdb target descriptions in the core file
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 27 Nov 2020 15:41:37 +0000 (15:41 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 5 Mar 2021 17:21:40 +0000 (17:21 +0000)
This commit lays the ground work for allowing GDB to write its target
description into a generated core file.

The goal of this work is to allow a user to connect to a remote
target, capture a core file from within GDB, then pass the executable
and core file to another user and have the user be able to examine the
state of the machine without needing to connect to a running target.

Different remote targets can have different register sets and this
information is communicated from the target to GDB in the target
description.

It is possible for a user to extract the target description from GDB
and pass this along with the core file so that when the core file is
used the target description can be fed back into GDB, however this is
not a great user experience.

It would be nicer, I think, if GDB could write the target description
directly into the core file, and then make use of this description
when loading a core file.

This commit performs the binutils/bfd side of this task, adding the
boiler plate functions to access the target description from within a
core file note, and reserving a new number for a note containing the
target description.  Later commits will extend GDB to make use of
this.

The new note is given the name 'GDB' and a type NT_GDB_TDESC.  This
should hopefully protect us if there's ever a reuse of the number
assigned to NT_GDB_TDESC by some other core file producer.  It should
also, hopefully, make it clearer to users that this note carries GDB
specific information.

bfd/ChangeLog:

* elf-bfd.h (elfcore_write_gdb_tdesc): Declare new function.
* elf.c (elfcore_grok_gdb_tdesc): New function.
(elfcore_grok_note): Handle NT_GDB_TDESC.
(elfcore_write_gdb_tdesc): New function.
(elfcore_write_register_note): Handle NT_GDB_TDESC.

binutils/ChangeLog:

* readelf.c (get_note_type): Handle NT_GDB_TDESC.

include/ChangeLog:

* elf/common.h (NT_GDB_TDESC): Define.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
binutils/ChangeLog
binutils/readelf.c
include/ChangeLog
include/elf/common.h

index d4525f1e69673d2895126fd24dacfbf51249776a..31d0714da2700eddae0ee9019392b05ae6d4b147 100644 (file)
@@ -1,3 +1,12 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * elf-bfd.h (elfcore_write_gdb_tdesc): Declare new function.
+       * elf.c (elfcore_grok_gdb_tdesc): New function.
+       (elfcore_grok_note): Handle NT_GDB_TDESC.
+       (elfcore_write_gdb_tdesc): New function.
+       (elfcore_write_register_note): Handle NT_GDB_TDESC.
+
 2021-03-05  Nick Clifton  <nickc@redhat.com>
 
        PR 27521
index dd66d98883e447fd1f55a07de6bfcdb0091dfe2a..69e18036a49730e89e9374952d3a6a4e2e0ef6b3 100644 (file)
@@ -2798,6 +2798,8 @@ extern char *elfcore_write_aarch_pauth
   (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_arc_v2
   (bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_gdb_tdesc
+  (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_lwpstatus
   (bfd *, char *, int *, long, int, const void *);
 extern char *elfcore_write_register_note
index 087f05e5cc8bdc5e792d79580349779bcf949e52..2d66e9b999f57303a21c973108e64d04dc61154b 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9912,6 +9912,15 @@ elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note)
   return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note);
 }
 
+/* Convert NOTE into a bfd_section called ".gdb-tdesc".  Return TRUE if
+   successful otherwise, return FALSE.  */
+
+static bfd_boolean
+elfcore_grok_gdb_tdesc (bfd *abfd, Elf_Internal_Note *note)
+{
+  return elfcore_make_note_pseudosection (abfd, ".gdb-tdesc", note);
+}
+
 #if defined (HAVE_PRPSINFO_T)
 typedef prpsinfo_t   elfcore_psinfo_t;
 #if defined (HAVE_PRPSINFO32_T)                /* Sparc64 cross Sparc32 */
@@ -10570,6 +10579,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
       else
        return TRUE;
 
+    case NT_GDB_TDESC:
+      if (note->namesz == 4
+          && strcmp (note->namedata, "GDB") == 0)
+        return elfcore_grok_gdb_tdesc (abfd, note);
+      else
+        return TRUE;
+
     case NT_PRPSINFO:
     case NT_PSINFO:
       if (bed->elf_backend_grok_psinfo)
@@ -11951,6 +11967,23 @@ elfcore_write_arc_v2 (bfd *abfd,
                             note_name, NT_ARC_V2, arc_v2, size);
 }
 
+/* Write the target description (a string) pointed to by TDESC, length
+   SIZE, into the note buffer BUF, and update *BUFSIZ.  ABFD is the bfd the
+   note is being written into.  Return a pointer to the new start of the
+   note buffer, to replace BUF which may no longer be valid.  */
+
+char *
+elfcore_write_gdb_tdesc (bfd *abfd,
+                        char *buf,
+                        int *bufsiz,
+                        const void *tdesc,
+                        int size)
+{
+  const char *note_name = "GDB";
+  return elfcore_write_note (abfd, buf, bufsiz,
+                             note_name, NT_GDB_TDESC, tdesc, size);
+}
+
 char *
 elfcore_write_register_note (bfd *abfd,
                             char *buf,
@@ -12035,6 +12068,8 @@ elfcore_write_register_note (bfd *abfd,
     return elfcore_write_aarch_pauth (abfd, buf, bufsiz, data, size);
   if (strcmp (section, ".reg-arc-v2") == 0)
     return elfcore_write_arc_v2 (abfd, buf, bufsiz, data, size);
+  if (strcmp (section, ".gdb-tdesc") == 0)
+    return elfcore_write_gdb_tdesc (abfd, buf, bufsiz, data, size);
   return NULL;
 }
 
index da24027199e6fc3642ea195eb61f05f307959195..80b6ea6a4c7d05c62c6a42a6ef48c63cbadfcb57 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * readelf.c (get_note_type): Handle NT_GDB_TDESC.
+
 2021-03-05  Nick Clifton  <nickc@redhat.com>
 
        PR 27387
index c862839b4cf27cbe75265baca4a82f27ce947943..fe58ebf6ac4130ff1a7ad4a868d3e6400f7a868f 100644 (file)
@@ -18499,6 +18499,8 @@ get_note_type (Filedata * filedata, unsigned e_type)
        return _("NT_PRPSINFO (prpsinfo structure)");
       case NT_TASKSTRUCT:
        return _("NT_TASKSTRUCT (task structure)");
+      case NT_GDB_TDESC:
+        return _("NT_GDB_TDESC (GDB XML target description)");
       case NT_PRXFPREG:
        return _("NT_PRXFPREG (user_xfpregs structure)");
       case NT_PPC_VMX:
index 7c53c21b9c39165c3129fe3d974c5671d0ba87eb..08c45673be65efeac406ce4c67684d4a1f08edc4 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-05  Craig Blackmore  <craig.blackmore@embecosm.com>
+           Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * elf/common.h (NT_GDB_TDESC): Define.
+
 2021-03-03  Alan Modra  <amodra@gmail.com>
 
        * coff/internal.h: Delete obsolete relocation defines.  Move used
index e7d55ae07825dab8adbbda044e7c89e469052427..e6e9c278faa50276b908a23724040273608041b3 100644 (file)
 #define NT_SIGINFO     0x53494749      /* Fields of siginfo_t.  */
 #define NT_FILE                0x46494c45      /* Description of mapped files.  */
 
+/* The range 0xff000000 to 0xffffffff is set aside for notes that don't
+   originate from any particular operating system.  */
+#define NT_GDB_TDESC   0xff000000      /* Contains copy of GDB's target description XML.  */
+
 /* Note segments for core files on dir-style procfs systems.  */
 
 #define NT_PSTATUS     10              /* Has a struct pstatus */