From patchwork Tue Jul 10 15:55:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Ser X-Patchwork-Id: 28295 Received: (qmail 127047 invoked by alias); 10 Jul 2018 15:55:48 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 127032 invoked by uid 89); 10 Jul 2018 15:55:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-27.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=H*F:U*contact, HX-Envelope-From:sk:contact X-HELO: mail-1857040132.protonmail.ch Received: from mail-1857040132.protonmail.ch (HELO mail-1857040132.protonmail.ch) (185.70.40.132) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Jul 2018 15:55:46 +0000 Date: Tue, 10 Jul 2018 11:55:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=emersion.fr; s=protonmail; t=1531238143; bh=hlq8QoRul9/G8jBxl9mC0LKMEr4slsxrPlEQ/ORP1Yw=; h=Date:To:From:Cc:Reply-To:Subject:Feedback-ID:From; b=DaQSa77FrQHWHFN3yx3rvwaioSWqZMcb3MiMqjtnafrp/543gPjlacqWQ/DBUIyOe XdxuwMe6X+Q9FbfBT2ipDXG7g43HolSm7np7uqKtMMIDn7aFCGWtCguYmbqwoN+3lp Wk11LJqEKwehlmorQcX0XpDLSQhLh8E+QcxlU9Ss= To: gdb-patches@sourceware.org From: Simon Ser Cc: Simon Ser Reply-To: Simon Ser Subject: [PATCH v2] gdb: generate NT_PROCSTAT_AUXV in FreeBSD coredumps Message-ID: MIME-Version: 1.0 gcore generates NT_AUXV notes for Linux targets. On FreeBSD the auxv is stored in a NT_PROCSTAT_AUXV section, and is prefixed with the struct size. --- Changes from v1 to v2: added missing struct size. I missed this when sending v1. The struct sizes are hardcoded, let me know if it's better to e.g. copy them over. gdb/fbsd-tdep.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c index 9cea0098..37e52bbc 100644 --- a/gdb/fbsd-tdep.c +++ b/gdb/fbsd-tdep.c @@ -29,6 +29,15 @@ #include "elf-bfd.h" #include "fbsd-tdep.h" +#define NT_PROCSTAT_PROC 8 /* Procstat proc data. */ +#define NT_PROCSTAT_FILES 9 /* Procstat files data. */ +#define NT_PROCSTAT_VMMAP 10 /* Procstat vmmap data. */ +#define NT_PROCSTAT_GROUPS 11 /* Procstat groups data. */ +#define NT_PROCSTAT_UMASK 12 /* Procstat umask data. */ +#define NT_PROCSTAT_RLIMIT 13 /* Procstat rlimit data. */ +#define NT_PROCSTAT_OSREL 14 /* Procstat osreldate data. */ +#define NT_PROCSTAT_PSSTRINGS 15 /* Procstat ps_strings data. */ +#define NT_PROCSTAT_AUXV 16 /* Procstat auxv data. */ /* FreeBSD kernels 12.0 and later include a copy of the 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace @@ -586,6 +595,29 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size) note_data = thread_args.note_data; + /* Auxillary vector. */ + gdb::optional auxv = + target_read_alloc (current_top_target (), TARGET_OBJECT_AUXV, NULL); + if (auxv && !auxv->empty ()) + { + size_t note_desc_size = sizeof (uint32_t) + auxv->size (); + char *note_desc = (char *)malloc (note_desc_size); + if (!note_desc) + return NULL; + uint32_t auxv_info_size = 8; + if (gdbarch_addr_bit (gdbarch) == 64) + auxv_info_size = 16; + memcpy (note_desc, &auxv_info_size, sizeof (uint32_t)); + memcpy (note_desc + sizeof (uint32_t), auxv->data (), auxv->size ()); + note_data = elfcore_write_note (obfd, note_data, note_size, + "FreeBSD", NT_PROCSTAT_AUXV, + note_desc, note_desc_size); + free(note_desc); + + if (!note_data) + return NULL; + } + return note_data; }