From: Gary Benson Date: Thu, 2 Apr 2015 12:38:29 +0000 (+0100) Subject: Update exec_file_attach to cope with "target:" filenames X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=64c0b5de8dfd68c54060b07d54b1edf8d22fc52b;p=binutils-gdb.git Update exec_file_attach to cope with "target:" filenames 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7cc42658724..27c68284bdb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2015-04-02 Gary Benson + + * exec.c (exec_file_attach): Support "target:" filenames. + 2015-04-02 Gary Benson * solib.c (solib_find): Strip "target:" prefix from sysroot diff --git a/gdb/exec.c b/gdb/exec.c index 124074ff50b..44c8480dd74 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)) { - char *exename = alloca (strlen (filename) + 5); + if (target_filesystem_is_local ()) + filename += strlen (TARGET_SYSROOT_PREFIX); + else + load_via_target = 1; + } + + if (load_via_target) + { + /* gdb_bfd_fopen does not support "target:" filenames. */ + 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); + + scratch_chan = -1; - 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); + 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 @@ -217,8 +247,13 @@ exec_file_attach (const char *filename, int from_tty) scratch_pathname, bfd_errmsg (bfd_get_error ())); } + /* gdb_realpath_keepfile resolves symlinks on the local + filesystem and so cannot be used for "target:" files. */ 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)) {