From patchwork Wed Apr 1 11:22:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 5952 Received: (qmail 92762 invoked by alias); 1 Apr 2015 11:30: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 92752 invoked by uid 89); 1 Apr 2015 11:30:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 01 Apr 2015 11:30:47 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t31BMY0F002881 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 1 Apr 2015 07:22:34 -0400 Received: from blade.nx (ovpn-116-118.ams2.redhat.com [10.36.116.118]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t31BMXsf011551 for ; Wed, 1 Apr 2015 07:22:34 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 0B234264112 for ; Wed, 1 Apr 2015 12:22:32 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH 6/7] Implement qXfer:exec-file:read in gdbserver Date: Wed, 1 Apr 2015 12:22:20 +0100 Message-Id: <1427887341-31819-7-git-send-email-gbenson@redhat.com> In-Reply-To: <1427887341-31819-1-git-send-email-gbenson@redhat.com> References: <1427887341-31819-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes This commit implements the "qXfer:exec-file:read" packet in gdbserver. gdb/gdbserver/ChangeLog: * target.h (struct target_ops) : New field. * linux-low.c (linux_target_ops): Initialize pid_to_exec_file. * server.c (handle_qxfer_exec_file): New function. (qxfer_packets): Add exec-file entry. (handle_query): Report qXfer:exec-file:read as supported packet. --- gdb/gdbserver/ChangeLog | 8 ++++++++ gdb/gdbserver/linux-low.c | 1 + gdb/gdbserver/server.c | 40 ++++++++++++++++++++++++++++++++++++++++ gdb/gdbserver/target.h | 8 ++++++++ 4 files changed, 57 insertions(+), 0 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index e4c5420..5ce39fb 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -6429,6 +6429,7 @@ static struct target_ops linux_target_ops = { NULL, #endif linux_supports_range_stepping, + linux_pid_to_exec_file, }; static void diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 96b31b8..31a2c04 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1137,6 +1137,42 @@ handle_qxfer_auxv (const char *annex, return (*the_target->read_auxv) (offset, readbuf, len); } +/* Handle qXfer:exec-file:read. */ + +static int +handle_qxfer_exec_file (const char *const_annex, + gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST offset, LONGEST len) +{ + char *annex, *file; + ULONGEST pid; + int total_len; + + if (the_target->pid_to_exec_file == NULL || writebuf != NULL) + return -2; + + annex = alloca (strlen (const_annex) + 1); + strcpy (annex, const_annex); + annex = unpack_varlen_hex (annex, &pid); + if (annex[0] != '\0' || pid == 0) + return -1; + + file = (*the_target->pid_to_exec_file) (pid); + if (file == NULL) + return -1; + + total_len = strlen (file); + + if (offset > total_len) + return -1; + + if (offset + len > total_len) + len = total_len - offset; + + memcpy (readbuf, file + offset, len); + return len; +} + /* Handle qXfer:features:read. */ static int @@ -1638,6 +1674,7 @@ static const struct qxfer qxfer_packets[] = { "auxv", handle_qxfer_auxv }, { "btrace", handle_qxfer_btrace }, { "btrace-conf", handle_qxfer_btrace_conf }, + { "exec-file", handle_qxfer_exec_file}, { "fdpic", handle_qxfer_fdpic}, { "features", handle_qxfer_features }, { "libraries", handle_qxfer_libraries }, @@ -2082,6 +2119,9 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (target_supports_stopped_by_hw_breakpoint ()) strcat (own_buf, ";hwbreak+"); + if (the_target->pid_to_exec_file != NULL) + strcat (own_buf, ";qXfer:exec-file:read+"); + return; } diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index 126c861..dc7802d 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -394,6 +394,14 @@ struct target_ops /* Return true if target supports range stepping. */ int (*supports_range_stepping) (void); + + /* Return the pathname of the executable file that was run to + create the process PID. If the executable file cannot be + determined, NULL is returned. Otherwise, a pointer to a + character string containing the pathname is returned. This + string should be copied into a buffer by the client if the + string will not be immediately used, or if it must persist. */ + char *(*pid_to_exec_file) (int pid); }; extern struct target_ops *the_target;