This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Implement qXfer:exec-file:read in gdbserver


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb

commit e57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb
Author: Gary Benson <gbenson@redhat.com>
Date:   Fri Apr 17 09:47:30 2015 +0100

    Implement qXfer:exec-file:read in gdbserver
    
    This commit implements the "qXfer:exec-file:read" packet in gdbserver.
    
    gdb/gdbserver/ChangeLog:
    
    	* target.h (struct target_ops) <pid_to_exec_file>: 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.

Diff:
---
 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(+)

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 165c42c..56da6dc 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,11 @@
+2015-04-17  Gary Benson  <gbenson@redhat.com>
+
+	* target.h (struct target_ops) <pid_to_exec_file>: 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.
+
 2015-04-14  Romain Naour <romain.naour@openwide.fr>  (tiny change)
 
 	* linux-low.c (linux_read_offsets): Remove get_thread_lwp.
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index a7f8446..1c4c2d7 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -6433,6 +6433,7 @@ static struct target_ops linux_target_ops = {
   NULL,
 #endif
   linux_supports_range_stepping,
+  linux_proc_pid_to_exec_file,
 };
 
 static void
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 3408ef7..d2e20d9 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..6280c26 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 full absolute name 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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]