PING: Re: [PATCHv2 2/9] bfd/binutils: support for gdb target descriptions in the core file
Andrew Burgess
andrew.burgess@embecosm.com
Mon Feb 1 12:05:21 GMT 2021
Ping!
This patch needs a review from the binutils side please.
I believe the conversation with Mihails was resolved and he is happy
with this patch as it is.
Thanks,
Andrew
* Andrew Burgess <andrew.burgess@embecosm.com> [2021-01-20 20:23:08 +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.
>
> 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 | 9 +++++++++
> bfd/elf-bfd.h | 2 ++
> bfd/elf.c | 23 +++++++++++++++++++++++
> binutils/ChangeLog | 5 +++++
> binutils/readelf.c | 2 ++
> include/ChangeLog | 5 +++++
> include/elf/common.h | 4 ++++
> 7 files changed, 50 insertions(+)
>
> diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
> index 15206b4e876..4dce8114c0f 100644
> --- a/bfd/elf-bfd.h
> +++ b/bfd/elf-bfd.h
> @@ -2797,6 +2797,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
> diff --git a/bfd/elf.c b/bfd/elf.c
> index 84a5d942817..9892ffa9faf 100644
> --- a/bfd/elf.c
> +++ b/bfd/elf.c
> @@ -9912,6 +9912,12 @@ elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note)
> return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note);
> }
>
> +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 +10576,9 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
> else
> return TRUE;
>
> + case NT_GDB_TDESC:
> + return elfcore_grok_gdb_tdesc (abfd, note);
> +
> case NT_PRPSINFO:
> case NT_PSINFO:
> if (bed->elf_backend_grok_psinfo)
> @@ -11951,6 +11960,18 @@ elfcore_write_arc_v2 (bfd *abfd,
> note_name, NT_ARC_V2, arc_v2, size);
> }
>
> +char *
> +elfcore_write_gdb_tdesc (bfd *abfd,
> + char *buf,
> + int *bufsiz,
> + const void *tdesc,
> + int size)
> +{
> + const char *note_name = "CORE";
> + 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 +12056,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;
> }
>
> diff --git a/binutils/readelf.c b/binutils/readelf.c
> index 5df51086226..feb458877c8 100644
> --- a/binutils/readelf.c
> +++ b/binutils/readelf.c
> @@ -18296,6 +18296,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:
> diff --git a/include/elf/common.h b/include/elf/common.h
> index e7d55ae0782..e6e9c278faa 100644
> --- a/include/elf/common.h
> +++ b/include/elf/common.h
> @@ -677,6 +677,10 @@
> #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 */
> --
> 2.25.4
>
More information about the Binutils
mailing list