From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75615 invoked by alias); 1 Apr 2015 12:14:47 -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 75571 invoked by uid 89); 1 Apr 2015 12:14:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 01 Apr 2015 12:14:40 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t31CEdSZ021776 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 1 Apr 2015 08:14:39 -0400 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t31CEbJ2007887; Wed, 1 Apr 2015 08:14:38 -0400 Message-ID: <551BE12D.1080300@redhat.com> Date: Wed, 01 Apr 2015 12:14:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Gary Benson , gdb-patches@sourceware.org Subject: Re: [PATCH 7/9] Update exec_file_attach to cope with "target:" filenames References: <1426870087-32654-1-git-send-email-gbenson@redhat.com> <1426870087-32654-8-git-send-email-gbenson@redhat.com> In-Reply-To: <1426870087-32654-8-git-send-email-gbenson@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2015-04/txt/msg00031.txt.bz2 On 03/20/2015 04:48 PM, Gary Benson wrote: > This commit adds support for filenames prefixed with "target:" to > exec_file_attach. This is required to correctly follow inferior > exec* calls when a gdb_sysroot prefixed with "target:" is set. Hmm, I don't see how. Isn't this only true when target_pid_to_exec_file prepends the sysroot, which it doesn't yet? I think this should move to that other series. A couple bits could use more explanation (in commit log and/or comments): - Why is writing into executable files not supported with "target:" ? - The skipping of gdb_realpath_keepfile. Thanks, Pedro Alves > > gdb/ChangeLog: > > * exec.c (exec_file_attach): Support "target:" filenames. > --- > gdb/ChangeLog | 4 +++ > gdb/exec.c | 71 +++++++++++++++++++++++++++++++++++++++++--------------- > 2 files changed, 56 insertions(+), 19 deletions(-) > > diff --git a/gdb/exec.c b/gdb/exec.c > index 124074f..113e869 100644 > --- a/gdb/exec.c > +++ b/gdb/exec.c > @@ -176,36 +176,66 @@ exec_file_attach (const char *filename, int from_tty) > } > else > { > + int load_via_target = 0; > char *scratch_pathname, *canonical_pathname; > int scratch_chan; > struct target_section *sections = NULL, *sections_end = NULL; > char **matching; > > - scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename, > - write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, > - &scratch_pathname); > -#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__) > - if (scratch_chan < 0) > + if (is_target_filename (filename)) > + { > + if (target_filesystem_is_local) > + filename += strlen (TARGET_SYSROOT_PREFIX); > + else > + load_via_target = 1; > + } > + > + if (load_via_target) > { > - char *exename = alloca (strlen (filename) + 5); > + if (write_files) > + warning (_("writing into executable files is " > + "not supported for %s sysroots"), > + TARGET_SYSROOT_PREFIX); > + > + scratch_pathname = xstrdup (filename); > + make_cleanup (xfree, scratch_pathname); > > - strcat (strcpy (exename, filename), ".exe"); > - scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename, > - write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, > - &scratch_pathname); > + scratch_chan = -1; > + > + canonical_pathname = scratch_pathname; > } > + else > + { > + > + scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, > + filename, write_files ? > + O_RDWR | O_BINARY : O_RDONLY | O_BINARY, > + &scratch_pathname); > +#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__) > + if (scratch_chan < 0) > + { > + char *exename = alloca (strlen (filename) + 5); > + > + strcat (strcpy (exename, filename), ".exe"); > + scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, > + exename, write_files ? > + O_RDWR | O_BINARY > + : O_RDONLY | O_BINARY, > + &scratch_pathname); > + } > #endif > - if (scratch_chan < 0) > - perror_with_name (filename); > + if (scratch_chan < 0) > + perror_with_name (filename); > > - make_cleanup (xfree, scratch_pathname); > + make_cleanup (xfree, scratch_pathname); > > - /* gdb_bfd_open (and its variants) prefers canonicalized pathname for > - better BFD caching. */ > - canonical_pathname = gdb_realpath (scratch_pathname); > - make_cleanup (xfree, canonical_pathname); > + /* gdb_bfd_open (and its variants) prefers canonicalized > + pathname for better BFD caching. */ > + canonical_pathname = gdb_realpath (scratch_pathname); > + make_cleanup (xfree, canonical_pathname); > + } > > - if (write_files) > + if (write_files && !load_via_target) > exec_bfd = gdb_bfd_fopen (canonical_pathname, gnutarget, > FOPEN_RUB, scratch_chan); > else > @@ -218,7 +248,10 @@ exec_file_attach (const char *filename, int from_tty) > } > > gdb_assert (exec_filename == NULL); > - exec_filename = gdb_realpath_keepfile (scratch_pathname); > + if (load_via_target) > + exec_filename = xstrdup (bfd_get_filename (exec_bfd)); > + else > + exec_filename = gdb_realpath_keepfile (scratch_pathname); > > if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching)) > { >