From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36166) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XsXDd-0001B1-Ty for qemu-devel@nongnu.org; Sun, 23 Nov 2014 08:28:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XsXDU-0007VV-MV for qemu-devel@nongnu.org; Sun, 23 Nov 2014 08:28:49 -0500 Received: from mail-pd0-x22a.google.com ([2607:f8b0:400e:c02::22a]:56057) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XsXDU-0007VE-F3 for qemu-devel@nongnu.org; Sun, 23 Nov 2014 08:28:40 -0500 Received: by mail-pd0-f170.google.com with SMTP id fp1so8261879pdb.1 for ; Sun, 23 Nov 2014 05:28:39 -0800 (PST) Received: from [192.168.2.3] ([123.110.214.155]) by mx.google.com with ESMTPSA id fn7sm9860658pad.38.2014.11.23.05.28.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Nov 2014 05:28:37 -0800 (PST) Message-ID: <5471E103.6080109@gmail.com> Date: Sun, 23 Nov 2014 21:28:35 +0800 From: "Wei-cheng, Wang" MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] gdbstub: Support AUXV packet for debugging PIE executables. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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 --- 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