diff options
author | Gary Benson <gbenson@redhat.com> | 2015-06-10 14:28:44 +0100 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2015-06-10 14:28:44 +0100 |
commit | 15a201c844e770d3c6edf174b9ef6596fbae7eb2 (patch) | |
tree | 3256ab18ea0ef36a50bdfb7edfeb948f040d5588 /gdb | |
parent | 7a6a173129107538574949116c0ce1c0ead589b4 (diff) | |
download | gdb-15a201c844e770d3c6edf174b9ef6596fbae7eb2.zip gdb-15a201c844e770d3c6edf174b9ef6596fbae7eb2.tar.gz gdb-15a201c844e770d3c6edf174b9ef6596fbae7eb2.tar.bz2 |
Implement multiple-filesystem support for remote targets
This commit allows GDB to access executables and shared libraries
on remote targets where the remote stub does not share a common
filesystem with the inferior(s). A new packet "vFile:setfs" is
added to the remote protocol and the three remote hostio functions
with filename arguments are modified to send "vFile:setfs" packets
as necessary.
gdb/ChangeLog:
* remote.c (struct remote_state) <fs_pid>: New field.
(new_remote_state): Initialize the above.
(PACKET_vFile_setfs): New enum value.
(remote_hostio_set_filesystem): New function.
(remote_hostio_open): Call the above.
(remote_hostio_unlink): Likewise.
(remote_hostio_readlink): Likewise.
(_initialize_remote): Register new "set/show remote
hostio-setfs-packet" command.
* NEWS: Announce new vFile:setfs packet.
gdb/doc/ChangeLog:
* gdb.texinfo (Remote Configuration): Document the
"set/show remote hostio-setfs-packet" command.
(Host I/O Packets): Document the vFile:setfs packet.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/NEWS | 6 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 18 | ||||
-rw-r--r-- | gdb/remote.c | 57 |
5 files changed, 100 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2e91c76..8598352 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,18 @@ 2015-06-10 Gary Benson <gbenson@redhat.com> + * remote.c (struct remote_state) <fs_pid>: New field. + (new_remote_state): Initialize the above. + (PACKET_vFile_setfs): New enum value. + (remote_hostio_set_filesystem): New function. + (remote_hostio_open): Call the above. + (remote_hostio_unlink): Likewise. + (remote_hostio_readlink): Likewise. + (_initialize_remote): Register new "set/show remote + hostio-setfs-packet" command. + * NEWS: Announce new vFile:setfs packet. + +2015-06-10 Gary Benson <gbenson@redhat.com> + * linux-nat.c (nat/linux-namespaces.h): New include. (fileio.h): Likewise. (linux_nat_filesystem_is_local): New function. @@ -174,6 +174,12 @@ qXfer:exec-file:read Return the full absolute name of the file that was executed to create a process running on the remote system. +vFile:setfs: + Select the filesystem on which vFile: operations with filename + arguments will operate. This is required for GDB to be able to + access files on remote targets where the remote stub does not + share a common filesystem with the inferior(s). + fork stop reason Indicates that a fork system call was executed. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index a9a8137..9264cfa 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,5 +1,11 @@ 2015-06-10 Gary Benson <gbenson@redhat.com> + * gdb.texinfo (Remote Configuration): Document the + "set/show remote hostio-setfs-packet" command. + (Host I/O Packets): Document the vFile:setfs packet. + +2015-06-10 Gary Benson <gbenson@redhat.com> + * gdb.texinfo (Debugging Output): Document the "set/show debug linux-namespaces" command. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 4bb092c..f502143 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19916,6 +19916,10 @@ are: @tab @code{vFile:fstat} @tab Host I/O +@item @code{hostio-setfs-packet} +@tab @code{vFile:setfs} +@tab Host I/O + @item @code{noack-packet} @tab @code{QStartNoAckMode} @tab Packet acknowledgment @@ -37742,6 +37746,20 @@ attachment (i.e.@: a trailing semicolon). The return value is the number of target bytes read; the binary attachment may be longer if some characters were escaped. +@item vFile:setfs: @var{pid} +Select the filesystem on which @code{vFile} operations with +@var{filename} arguments will operate. This is required for +@value{GDBN} to be able to access files on remote targets where +the remote stub does not share a common filesystem with the +inferior(s). + +If @var{pid} is nonzero, select the filesystem as seen by process +@var{pid}. If @var{pid} is zero, select the filesystem as seen by +the remote stub. Return 0 on success, or -1 if an error occurs. +If @code{vFile:setfs:} indicates success, the selected filesystem +remains selected until the next successful @code{vFile:setfs:} +operation. + @end table @node Interrupts diff --git a/gdb/remote.c b/gdb/remote.c index f8682b4..6dd85fb 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -373,6 +373,12 @@ struct remote_state /* The branch trace configuration. */ struct btrace_config btrace_config; + + /* The argument to the last "vFile:setfs:" packet we sent, used + to avoid sending repeated unnecessary "vFile:setfs:" packets. + Initialized to -1 to indicate that no "vFile:setfs:" packet + has yet been sent. */ + int fs_pid; }; /* Private data that we'll store in (struct thread_info)->private. */ @@ -415,6 +421,7 @@ new_remote_state (void) result->buf = xmalloc (result->buf_size); result->remote_traceframe_number = -1; result->last_sent_signal = GDB_SIGNAL_0; + result->fs_pid = -1; return result; } @@ -1249,6 +1256,7 @@ enum { PACKET_Z2, PACKET_Z3, PACKET_Z4, + PACKET_vFile_setfs, PACKET_vFile_open, PACKET_vFile_pread, PACKET_vFile_pwrite, @@ -10213,6 +10221,43 @@ remote_hostio_send_command (int command_bytes, int which_packet, return ret; } +/* Set the filesystem remote_hostio functions that take FILENAME + arguments will use. Return 0 on success, or -1 if an error + occurs (and set *REMOTE_ERRNO). */ + +static int +remote_hostio_set_filesystem (struct inferior *inf, int *remote_errno) +{ + struct remote_state *rs = get_remote_state (); + int required_pid = (inf == NULL || inf->fake_pid_p) ? 0 : inf->pid; + char *p = rs->buf; + int left = get_remote_packet_size () - 1; + char arg[9]; + int ret; + + if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + return 0; + + if (rs->fs_pid != -1 && required_pid == rs->fs_pid) + return 0; + + remote_buffer_add_string (&p, &left, "vFile:setfs:"); + + xsnprintf (arg, sizeof (arg), "%x", required_pid); + remote_buffer_add_string (&p, &left, arg); + + ret = remote_hostio_send_command (p - rs->buf, PACKET_vFile_setfs, + remote_errno, NULL, NULL); + + if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + return 0; + + if (ret == 0) + rs->fs_pid = required_pid; + + return ret; +} + /* Implementation of to_fileio_open. */ static int @@ -10224,6 +10269,9 @@ remote_hostio_open (struct target_ops *self, char *p = rs->buf; int left = get_remote_packet_size () - 1; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return -1; + remote_buffer_add_string (&p, &left, "vFile:open:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -10333,6 +10381,9 @@ remote_hostio_unlink (struct target_ops *self, char *p = rs->buf; int left = get_remote_packet_size () - 1; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return -1; + remote_buffer_add_string (&p, &left, "vFile:unlink:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -10357,6 +10408,9 @@ remote_hostio_readlink (struct target_ops *self, int read_len; char *ret; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return NULL; + remote_buffer_add_string (&p, &left, "vFile:readlink:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -12711,6 +12765,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, add_packet_config_cmd (&remote_protocol_packets[PACKET_qTStatus], "qTStatus", "trace-status", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_setfs], + "vFile:setfs", "hostio-setfs", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_open], "vFile:open", "hostio-open", 0); |