diff options
author | Gary Benson <gbenson@redhat.com> | 2015-04-02 13:38:29 +0100 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2015-04-02 13:38:29 +0100 |
commit | 64c0b5de8dfd68c54060b07d54b1edf8d22fc52b (patch) | |
tree | 2dc74d7f6a99dd6391a0666cddc8b35cef32cae1 /gdb/exec.c | |
parent | b57fbfba4b53434252fce55e323f08aeab556409 (diff) | |
download | gdb-64c0b5de8dfd68c54060b07d54b1edf8d22fc52b.zip gdb-64c0b5de8dfd68c54060b07d54b1edf8d22fc52b.tar.gz gdb-64c0b5de8dfd68c54060b07d54b1edf8d22fc52b.tar.bz2 |
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.
Diffstat (limited to 'gdb/exec.c')
-rw-r--r-- | gdb/exec.c | 73 |
1 files changed, 54 insertions, 19 deletions
@@ -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)) { |