From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 85405 invoked by alias); 28 Dec 2017 02:19:16 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 85395 invoked by uid 89); 28 Dec 2017 02:19:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=Hx-languages-length:3977 X-HELO: simark.ca Received: from simark.ca (HELO simark.ca) (158.69.221.121) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 28 Dec 2017 02:19:14 +0000 Received: from [10.0.0.11] (192-222-251-162.qc.cable.ebox.net [192.222.251.162]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 61B861E02D; Wed, 27 Dec 2017 21:19:12 -0500 (EST) Subject: Re: [PATCH] hurd: Add enough auxv support for AT_ENTRY for PIE binaries To: Samuel Thibault , gdb-patches@sourceware.org References: <20171227154156.130174-1-samuel.thibault@ens-lyon.org> From: Simon Marchi Message-ID: <30c5c1ec-2502-56a9-bf61-7848925e8f72@simark.ca> Date: Thu, 28 Dec 2017 02:19:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20171227154156.130174-1-samuel.thibault@ens-lyon.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2017-12/txt/msg00515.txt.bz2 On 2017-12-27 10:41 AM, Samuel Thibault wrote: > gdb/ChangeLog: > > * gdb/gnu-nat.c: Include and . > (gnu_xfer_auxv): New function. > (gnu_xfer_partial): Call gnu_xfer_auxv when `object' is > TARGET_OBJECT_AUXV. > --- > gdb/ChangeLog | 7 +++++++ > gdb/gnu-nat.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 65 insertions(+) > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 4d85029b99..40d8e6e1cf 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,10 @@ > +2017-12-22 Samuel Thibault > + > + * gdb/gnu-nat.c: Include and . > + (gnu_xfer_auxv): New function. > + (gnu_xfer_partial): Call gnu_xfer_auxv when `object' is > + TARGET_OBJECT_AUXV. > + > 2017-12-27 Franck Jullien > Stafford Horne > > diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c > index 0d500ea38d..7d9c7d8dfa 100644 > --- a/gdb/gnu-nat.c > +++ b/gdb/gnu-nat.c > @@ -52,6 +52,8 @@ extern "C" > #include > #include > #include > +#include > +#include > > #include "inferior.h" > #include "symtab.h" > @@ -2541,6 +2543,60 @@ gnu_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, > } > } > > +/* GNU does not have auxv, but we can at least fake the AT_ENTRY entry for PIE > + binaries. */ > +static enum target_xfer_status > +gnu_xfer_auxv (gdb_byte *readbuf, const gdb_byte *writebuf, > + CORE_ADDR memaddr, ULONGEST len, ULONGEST *xfered_len) > +{ > + task_t task = (gnu_current_inf > + ? (gnu_current_inf->task > + ? gnu_current_inf->task->port : 0) > + : 0); > + process_t proc; > + int res; > + kern_return_t err; > + vm_address_t entry; > + ElfW(auxv_t) auxv[2]; > + > + if (task == MACH_PORT_NULL) > + return TARGET_XFER_E_IO; > + if (writebuf != NULL) > + return TARGET_XFER_E_IO; > + > + if (memaddr == sizeof (auxv)) > + return TARGET_XFER_EOF; > + if (memaddr > sizeof (auxv)) > + return TARGET_XFER_E_IO; > + > + err = proc_task2proc (proc_server, task, &proc); > + if (err != 0) > + return TARGET_XFER_E_IO; > + > + /* Get entry from proc server. */ > + err = proc_get_entry (proc, &entry); > + if (err != 0) > + return TARGET_XFER_E_IO; > + > + /* Fake auxv entry. */ > + auxv[0].a_type = AT_ENTRY; > + auxv[0].a_un.a_val = entry; > + auxv[1].a_type = AT_NULL; > + auxv[1].a_un.a_val = 0; > + > + inf_debug (gnu_current_inf, "reading auxv %s[%s] --> %s", > + paddress (target_gdbarch (), memaddr), pulongest (len), > + host_address_to_string (readbuf)); > + > + if (memaddr + len > sizeof (auxv)) > + len = sizeof (auxv) - memaddr; > + > + memcpy (readbuf, (gdb_byte *) &auxv + memaddr, len); > + *xfered_len = len; > + > + return TARGET_XFER_OK; > +} > + > /* Target to_xfer_partial implementation. */ > > static enum target_xfer_status > @@ -2553,6 +2609,8 @@ gnu_xfer_partial (struct target_ops *ops, enum target_object object, > { > case TARGET_OBJECT_MEMORY: > return gnu_xfer_memory (readbuf, writebuf, offset, len, xfered_len); > + case TARGET_OBJECT_AUXV: > + return gnu_xfer_auxv (readbuf, writebuf, offset, len, xfered_len); > default: > return TARGET_XFER_E_IO; > } > Hi Samuel, As I said in the previous thread, the patch looks good to me, but I don't have a setup to test. I would like to leave some time for others to comment, especially because I don't expect people to be very active these days. If nobody has commented by the time we are ready to create the 8.1 branch (supposed to be in January), we'll merge it. I'll add a note to the GDB 8.1 release wiki page [1] so we don't forget. Does that sound good to you? In the mean time, I'd like to add some details to the commit message about how this is expected to work. The AT_ENTRY value set here will be read by the svr4_exec_displacement function, is that right? Thanks, Simon [1] https://sourceware.org/gdb/wiki/GDB_8.1_Release