* [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables.
@ 2014-11-23 13:28 Wei-cheng, Wang
2014-11-27 16:57 ` Paolo Bonzini
0 siblings, 1 reply; 3+ messages in thread
From: Wei-cheng, Wang @ 2014-11-23 13:28 UTC (permalink / raw)
To: qemu-devel
Hi,
This patch adds support for sending AUXV packet.
This is required for debugging Linux position independent executables.
Otherwise, gdb client cannot find out where the executable is loaded.
Signed-off-by: Wei-cheng, Wang <cole945@gmail.com>
---
gdbstub.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/gdbstub.c b/gdbstub.c
index d1b5afd..30f3bbc 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1127,6 +1127,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
if (cc->gdb_core_xml_file != NULL) {
pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
}
+ pstrcat(buf, sizeof(buf), ";qXfer:auxv:read+");
put_packet(s, buf);
break;
}
@@ -1173,6 +1174,46 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
put_packet_binary(s, buf, len + 1);
break;
}
+#ifdef CONFIG_USER_ONLY
+ if (strncmp(p, "Xfer:auxv:read:", 15) == 0) {
+ TaskState *ts = s->c_cpu->opaque;
+ target_ulong auxv = ts->info->saved_auxv;
+ target_ulong auxv_len = ts->info->auxv_len;
+ char *ptr;
+
+ p += 15;
+ while (*p && *p != ':')
+ p++;
+ p++;
+
+ addr = strtoul(p, (char **)&p, 16);
+ if (*p == ',')
+ p++;
+ len = strtoul(p, (char **)&p, 16);
+
+ ptr = lock_user(VERIFY_READ, auxv, auxv_len, 0);
+ if (ptr == NULL) {
+ break;
+ }
+
+ if (addr > len) {
+ snprintf(buf, sizeof(buf), "E00");
+ put_packet(s, buf);
+ break;
+ }
+ if (len > (MAX_PACKET_LENGTH - 5) / 2)
+ len = (MAX_PACKET_LENGTH - 5) / 2;
+ if (len < auxv_len - addr) {
+ buf[0] = 'm';
+ len = memtox(buf + 1, ptr + addr, len);
+ } else {
+ buf[0] = 'l';
+ len = memtox(buf + 1, ptr + addr, auxv_len - addr);
+ }
+ put_packet_binary(s, buf, len + 1);
+ unlock_user(ptr, auxv, len);
+ }
+#endif /* !CONFIG_USER_ONLY */
/* Unrecognised 'q' command. */
goto unknown_command;
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables.
2014-11-23 13:28 [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables Wei-cheng, Wang
@ 2014-11-27 16:57 ` Paolo Bonzini
2014-12-25 17:31 ` Wei-cheng Wang
0 siblings, 1 reply; 3+ messages in thread
From: Paolo Bonzini @ 2014-11-27 16:57 UTC (permalink / raw)
To: Wei-cheng, Wang, riku.voipio, qemu-devel
CCing Riku Voipio for a review.
Paolo
On 23/11/2014 14:28, Wei-cheng, Wang wrote:
> Hi,
>
> This patch adds support for sending AUXV packet.
> This is required for debugging Linux position independent executables.
> Otherwise, gdb client cannot find out where the executable is loaded.
>
> Signed-off-by: Wei-cheng, Wang <cole945@gmail.com>
> ---
> gdbstub.c | 41 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
> diff --git a/gdbstub.c b/gdbstub.c
> index d1b5afd..30f3bbc 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -1127,6 +1127,7 @@ static int gdb_handle_packet(GDBState *s, const
> char *line_buf)
> if (cc->gdb_core_xml_file != NULL) {
> pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
> }
> + pstrcat(buf, sizeof(buf), ";qXfer:auxv:read+");
> put_packet(s, buf);
> break;
> }
> @@ -1173,6 +1174,46 @@ static int gdb_handle_packet(GDBState *s, const
> char *line_buf)
> put_packet_binary(s, buf, len + 1);
> break;
> }
> +#ifdef CONFIG_USER_ONLY
> + if (strncmp(p, "Xfer:auxv:read:", 15) == 0) {
> + TaskState *ts = s->c_cpu->opaque;
> + target_ulong auxv = ts->info->saved_auxv;
> + target_ulong auxv_len = ts->info->auxv_len;
> + char *ptr;
> +
> + p += 15;
> + while (*p && *p != ':')
> + p++;
> + p++;
> +
> + addr = strtoul(p, (char **)&p, 16);
> + if (*p == ',')
> + p++;
> + len = strtoul(p, (char **)&p, 16);
> +
> + ptr = lock_user(VERIFY_READ, auxv, auxv_len, 0);
> + if (ptr == NULL) {
> + break;
> + }
> +
> + if (addr > len) {
> + snprintf(buf, sizeof(buf), "E00");
> + put_packet(s, buf);
> + break;
> + }
> + if (len > (MAX_PACKET_LENGTH - 5) / 2)
> + len = (MAX_PACKET_LENGTH - 5) / 2;
> + if (len < auxv_len - addr) {
> + buf[0] = 'm';
> + len = memtox(buf + 1, ptr + addr, len);
> + } else {
> + buf[0] = 'l';
> + len = memtox(buf + 1, ptr + addr, auxv_len - addr);
> + }
> + put_packet_binary(s, buf, len + 1);
> + unlock_user(ptr, auxv, len);
> + }
> +#endif /* !CONFIG_USER_ONLY */
> /* Unrecognised 'q' command. */
> goto unknown_command;
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables.
2014-11-27 16:57 ` Paolo Bonzini
@ 2014-12-25 17:31 ` Wei-cheng Wang
0 siblings, 0 replies; 3+ messages in thread
From: Wei-cheng Wang @ 2014-12-25 17:31 UTC (permalink / raw)
To: Paolo Bonzini, riku.voipio, qemu-devel
Ping :)
Thanks,
Wei-cheng
On 11/28/2014 12:57 AM, Paolo Bonzini wrote:
> CCing Riku Voipio for a review.
>
> Paolo
>
> On 23/11/2014 14:28, Wei-cheng, Wang wrote:
>> Hi,
>>
>> This patch adds support for sending AUXV packet.
>> This is required for debugging Linux position independent executables.
>> Otherwise, gdb client cannot find out where the executable is loaded.
>>
>> Signed-off-by: Wei-cheng, Wang <cole945@gmail.com>
>> ---
>> gdbstub.c | 41 +++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 41 insertions(+)
>>
>> diff --git a/gdbstub.c b/gdbstub.c
>> index d1b5afd..30f3bbc 100644
>> --- a/gdbstub.c
>> +++ b/gdbstub.c
>> @@ -1127,6 +1127,7 @@ static int gdb_handle_packet(GDBState *s, const
>> char *line_buf)
>> if (cc->gdb_core_xml_file != NULL) {
>> pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
>> }
>> + pstrcat(buf, sizeof(buf), ";qXfer:auxv:read+");
>> put_packet(s, buf);
>> break;
>> }
>> @@ -1173,6 +1174,46 @@ static int gdb_handle_packet(GDBState *s, const
>> char *line_buf)
>> put_packet_binary(s, buf, len + 1);
>> break;
>> }
>> +#ifdef CONFIG_USER_ONLY
>> + if (strncmp(p, "Xfer:auxv:read:", 15) == 0) {
>> + TaskState *ts = s->c_cpu->opaque;
>> + target_ulong auxv = ts->info->saved_auxv;
>> + target_ulong auxv_len = ts->info->auxv_len;
>> + char *ptr;
>> +
>> + p += 15;
>> + while (*p && *p != ':')
>> + p++;
>> + p++;
>> +
>> + addr = strtoul(p, (char **)&p, 16);
>> + if (*p == ',')
>> + p++;
>> + len = strtoul(p, (char **)&p, 16);
>> +
>> + ptr = lock_user(VERIFY_READ, auxv, auxv_len, 0);
>> + if (ptr == NULL) {
>> + break;
>> + }
>> +
>> + if (addr > len) {
>> + snprintf(buf, sizeof(buf), "E00");
>> + put_packet(s, buf);
>> + break;
>> + }
>> + if (len > (MAX_PACKET_LENGTH - 5) / 2)
>> + len = (MAX_PACKET_LENGTH - 5) / 2;
>> + if (len < auxv_len - addr) {
>> + buf[0] = 'm';
>> + len = memtox(buf + 1, ptr + addr, len);
>> + } else {
>> + buf[0] = 'l';
>> + len = memtox(buf + 1, ptr + addr, auxv_len - addr);
>> + }
>> + put_packet_binary(s, buf, len + 1);
>> + unlock_user(ptr, auxv, len);
>> + }
>> +#endif /* !CONFIG_USER_ONLY */
>> /* Unrecognised 'q' command. */
>> goto unknown_command;
>>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-12-25 17:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-23 13:28 [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables Wei-cheng, Wang
2014-11-27 16:57 ` Paolo Bonzini
2014-12-25 17:31 ` Wei-cheng Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).