From patchwork Fri Mar 20 16:48:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 5736 Received: (qmail 85038 invoked by alias); 20 Mar 2015 17:18:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 85023 invoked by uid 89); 20 Mar 2015 17:18:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 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; Fri, 20 Mar 2015 17:18:18 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t2KHIHMq004318 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 20 Mar 2015 13:18:17 -0400 Received: from blade.nx (ovpn-116-93.ams2.redhat.com [10.36.116.93]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t2KGmCeI007319 for ; Fri, 20 Mar 2015 12:48:12 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 9FA2326410D for ; Fri, 20 Mar 2015 16:48:10 +0000 (GMT) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH 7/9] Update exec_file_attach to cope with "target:" filenames Date: Fri, 20 Mar 2015 16:48:05 +0000 Message-Id: <1426870087-32654-8-git-send-email-gbenson@redhat.com> In-Reply-To: <1426870087-32654-1-git-send-email-gbenson@redhat.com> References: <1426870087-32654-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes 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. 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)) {