From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by sourceware.org (Postfix) with ESMTPS id D4C7738618BB for ; Mon, 15 Feb 2021 17:29:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D4C7738618BB Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wm1-x331.google.com with SMTP id w4so6840419wmi.4 for ; Mon, 15 Feb 2021 09:29:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2uZMbjrAZjT9ZRvvbIRyE+dSfJPvvAK9Abh3LFMkLNc=; b=Dnv5mvVT2mstkKaf/Hy43r+aRR/xm83V00OcFi+ZnKz1u2zIHpnyq7Tsgy5ZWZWdff 9r72/8fDbkSof30oI915wbNfIUvC2ryDK3ZnCwKoZaQnBnmL/eOUtZqJRwyZBkHkf3Vq L3OJDOCvMP8SyH6Zj+gKmh3tZ5frweIXnm8Aj5kN95JNQkKqSrpW2uaCi4VQUplpNOvr hqwnCkeR1MRHP873FDaDK0C6FoqSTWfh+9mVA3HrxgxoW0oohsLoG7i3JiBg4ZAWOw1P txXzNtFZ3hwfcxPCuAbe36RixhoFne7R+ZYIyGW9IDjGj3GBFY/sklOMfU+bbJtGekR8 gwSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2uZMbjrAZjT9ZRvvbIRyE+dSfJPvvAK9Abh3LFMkLNc=; b=BIiaZeYC8IA6TfwoavTw5sc7NntcK1Y3UFv+gb/DNADSlovK/nlX5aNX83VlA3fUQ3 +hoa5bam+VNv6mRsht6FwoZHUM7FGoUoSd/wSEhrVYjD9TMopToKDNRw8pb67fG8SsoJ N6Mcelieu7ruLnR1HOH2MQWWIVbK/QNxE6OjHPJjIcrpCtdk/gk5O2MMiKprRo/bVjg9 E6qPDgWKOQ9bVVIPBpWTnYTFMgBGoHClZCPzrY9rzhC48GyTxbzjss2oOLz+X2jTqwDu uguJPSYb0N8M0kB5/T46ago/UJ6RuV94mKXovpeim0Ny0F+UkuWQSOKxzSCrbXI891TU Kbkg== X-Gm-Message-State: AOAM532GMihwghyHa1vp5JR1Xd6e6L5T4WPAeNxpnvxqjTw+GBs7bqSE m50zzZrBgTekxtxHy3QEh374Coyrp7j9Ww== X-Google-Smtp-Source: ABdhPJyttvsQMGqDQWv1AuIOHiQXtPsQvNt3nlHnmD/IFsVw2/t5Snr6QhsiuIHpbkmUrg9Ajkzn0g== X-Received: by 2002:a1c:9a06:: with SMTP id c6mr2239090wme.140.1613410160697; Mon, 15 Feb 2021 09:29:20 -0800 (PST) Received: from localhost (host86-186-80-154.range86-186.btcentralplus.com. [86.186.80.154]) by smtp.gmail.com with ESMTPSA id j17sm25071589wmc.28.2021.02.15.09.29.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Feb 2021 09:29:20 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org, binutils@sourceware.org Subject: [PATCHv3 2/9] bfd/binutils: support for gdb target descriptions in the core file Date: Mon, 15 Feb 2021 17:29:05 +0000 Message-Id: X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Feb 2021 17:29:23 -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 | 9 +++++++++ bfd/elf-bfd.h | 2 ++ bfd/elf.c | 35 +++++++++++++++++++++++++++++++++++ binutils/ChangeLog | 5 +++++ binutils/readelf.c | 2 ++ include/ChangeLog | 5 +++++ include/elf/common.h | 4 ++++ 7 files changed, 62 insertions(+) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 4b79ee8eb62..8b989e71580 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2796,6 +2796,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 087f05e5cc8..2d66e9b999f 100644 --- 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; } diff --git a/binutils/readelf.c b/binutils/readelf.c index 755634dfe5d..277fcd3bc5a 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -18318,6 +18318,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