diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2016-12-22 22:14:02 -0500 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2017-06-07 19:56:09 -0400 |
commit | aefd8b33d97bded58e51d75271f99e1eaec9fb28 (patch) | |
tree | d0d9b9017717644c5344682003d24c7dba73963b /gdb/remote.c | |
parent | 2090129c36c7e582943b7d300968d19b46160d84 (diff) | |
download | gdb-aefd8b33d97bded58e51d75271f99e1eaec9fb28.zip gdb-aefd8b33d97bded58e51d75271f99e1eaec9fb28.tar.gz gdb-aefd8b33d97bded58e51d75271f99e1eaec9fb28.tar.bz2 |
Implement proper "startup-with-shell" support on gdbserver
This patch implements the proper support for the "startup-with-shell"
feature on gdbserver. A new packet is added, QStartupWithShell, and
it is sent on initialization. If the host sends a
"QStartupWithShell:1", it means the inferior shall be started using a
shell. If the host sends a "QStartupWithShell:0", it means the
inferior shall be started without using a shell. Any other value is
considered an error.
There is no way to remotely set the shell that will be used by the
target to start the inferior. In order to do that, the user must
start gdbserver while providing a shell via the $SHELL environment
variable. The same is true for the host side.
The "set startup-with-shell" setting from the host side is used to
decide whether to start the remote inferior using a shell. This same
setting is also used to decide whether to use a shell to start the
host inferior; this means that it is not really possible to start the
inferior using different mechanisms on target and host.
A documentation patch is included, along with a new testcase for the
feature.
gdb/ChangeLog:
2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com>
* NEWS (Changes since GDB 8.0): Announce that GDBserver is now
able to start inferiors using a shell.
(New remote packets): Announce new packet "QStartupWithShell".
* remote.c: Add PACKET_QStartupWithShell.
(extended_remote_create_inferior): Handle new
PACKET_QStartupWithShell.
(remote_protocol_features) <QStartupWithShell>: New entry for
PACKET_QStartupWithShell.
(_initialize_remote): Call "add_packet_config_cmd" for
QStartupShell.
gdb/gdbserver/ChangeLog:
2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com>
* server.c (handle_general_set): Handle new packet
"QStartupWithShell".
(handle_query): Add "QStartupWithShell" to the list of supported
packets.
(gdbserver_usage): Add help text explaining the
new "--startup-with-shell" and "--no-startup-with-shell" CLI
options.
(captured_main): Recognize and act upon the presence of the new
CLI options.
gdb/testsuite/ChangeLog:
2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com>
* gdb.base/startup-with-shell.c: New file.
* gdb.base/startup-with-shell.exp: Likewise.
gdb/doc/ChangeLog:
2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com>
* gdb.texinfo (Starting) <startup-with-shell>: Add @anchor.
(Connecting) <Remote Packet>: Add "startup-with-shell"
and "QStartupWithShell" to the table.
(Remote Protocol) <QStartupWithShell>: New item, explaining the
packet.
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index 1f86079..b66ecee 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1428,6 +1428,7 @@ enum { PACKET_QPassSignals, PACKET_QCatchSyscalls, PACKET_QProgramSignals, + PACKET_QStartupWithShell, PACKET_qCRC, PACKET_qSearch_memory, PACKET_vAttach, @@ -4633,6 +4634,8 @@ static const struct protocol_feature remote_protocol_features[] = { PACKET_QCatchSyscalls }, { "QProgramSignals", PACKET_DISABLE, remote_supported_packet, PACKET_QProgramSignals }, + { "QStartupWithShell", PACKET_DISABLE, remote_supported_packet, + PACKET_QStartupWithShell }, { "QStartNoAckMode", PACKET_DISABLE, remote_supported_packet, PACKET_QStartNoAckMode }, { "multiprocess", PACKET_DISABLE, remote_supported_packet, @@ -9614,6 +9617,20 @@ extended_remote_create_inferior (struct target_ops *ops, if (extended_remote_supports_disable_randomization (ops)) extended_remote_disable_randomization (disable_randomization); + /* If startup-with-shell is on, we inform gdbserver to start the + remote inferior using a shell. */ + if (packet_support (PACKET_QStartupWithShell) != PACKET_DISABLE) + { + xsnprintf (rs->buf, get_remote_packet_size (), + "QStartupWithShell:%d", startup_with_shell ? 1 : 0); + putpkt (rs->buf); + getpkt (&rs->buf, &rs->buf_size, 0); + if (strcmp (rs->buf, "OK") != 0) + error (_("\ +Remote replied unexpectedly while setting startup-with-shell: %s"), + rs->buf); + } + /* Now restart the remote server. */ run_worked = extended_remote_run (args) != -1; if (!run_worked) @@ -14104,6 +14121,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, add_packet_config_cmd (&remote_protocol_packets[PACKET_QProgramSignals], "QProgramSignals", "program-signals", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_QStartupWithShell], + "QStartupWithShell", "startup-with-shell", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_qSymbol], "qSymbol", "symbol-lookup", 0); |