aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2015-04-17 09:47:30 +0100
committerGary Benson <gbenson@redhat.com>2015-04-17 09:47:30 +0100
commite57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb (patch)
tree519f342e28449c2327829ac6c2687f7931463f20
parentc78fa86a213db1bdef328437ac262a4f54577827 (diff)
downloadgdb-e57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb.zip
gdb-e57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb.tar.gz
gdb-e57f1de3b37e17e1c80515f6e80ecb4ccd1bf0fb.tar.bz2
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.
-rw-r--r--gdb/gdbserver/ChangeLog8
-rw-r--r--gdb/gdbserver/linux-low.c1
-rw-r--r--gdb/gdbserver/server.c40
-rw-r--r--gdb/gdbserver/target.h8
4 files changed, 57 insertions, 0 deletions
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;