aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2015-04-02 13:38:29 +0100
committerGary Benson <gbenson@redhat.com>2015-04-02 13:38:29 +0100
commit2938e6cf0809cd81d1593f414ea5836812e68ed2 (patch)
tree96a1f27dddd0331a1db735698d611fc53d60c8ca /gdb
parentMake gdb_bfd_open able to open BFDs using target fileio (diff)
downloadbinutils-gdb-2938e6cf0809cd81d1593f414ea5836812e68ed2.tar.gz
binutils-gdb-2938e6cf0809cd81d1593f414ea5836812e68ed2.tar.bz2
binutils-gdb-2938e6cf0809cd81d1593f414ea5836812e68ed2.zip
Convert "remote:" sysroots to "target:" and remove "remote:"
The functionality of "target:" sysroots is a superset of the functionality of "remote:" sysroots. This commit causes the "set sysroot" command to rewrite "remote:" sysroots as "target:" sysroots and replaces "remote:" specific code with "target:" specific code where still necessary. gdb/ChangeLog: * remote.h (REMOTE_SYSROOT_PREFIX): Remove definition. (remote_filename_p): Remove declaration. (remote_bfd_open): Likewise. * remote.c (remote_bfd_iovec_open): Remove function. (remote_bfd_iovec_close): Likewise. (remote_bfd_iovec_pread): Likewise. (remote_bfd_iovec_stat): Likewise. (remote_filename_p): Likewise. (remote_bfd_open): Likewise. * symfile.h (gdb_bfd_open_maybe_remote): Remove declaration. * symfile.c (separate_debug_file_exists): Use gdb_bfd_open. (gdb_bfd_open_maybe_remote): Remove function. (symfile_bfd_open): Replace remote filename check with target filename check. (reread_symbols): Use gdb_bfd_open. * build-id.c (gdbcore.h): New include. (build_id_to_debug_bfd): Use gdb_bfd_open. * infcmd.c (attach_command_post_wait): Remove remote filename check. * solib.c (solib_find): Replace remote-specific handling with target-specific handling. Update comments where necessary. (solib_bfd_open): Replace remote-specific handling with target-specific handling. (gdb_sysroot_changed): New function. (_initialize_solib): Call the above when gdb_sysroot changes. * windows-tdep.c (gdbcore.h): New include. (windows_xfer_shared_library): Use gdb_bfd_open.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog30
-rw-r--r--gdb/build-id.c3
-rw-r--r--gdb/remote.c107
-rw-r--r--gdb/remote.h11
-rw-r--r--gdb/solib.c64
-rw-r--r--gdb/symfile.c25
-rw-r--r--gdb/symfile.h2
-rw-r--r--gdb/windows-tdep.c3
8 files changed, 80 insertions, 165 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 35acfedfd93..95332356fbd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,35 @@
2015-04-02 Gary Benson <gbenson@redhat.com>
+ * remote.h (REMOTE_SYSROOT_PREFIX): Remove definition.
+ (remote_filename_p): Remove declaration.
+ (remote_bfd_open): Likewise.
+ * remote.c (remote_bfd_iovec_open): Remove function.
+ (remote_bfd_iovec_close): Likewise.
+ (remote_bfd_iovec_pread): Likewise.
+ (remote_bfd_iovec_stat): Likewise.
+ (remote_filename_p): Likewise.
+ (remote_bfd_open): Likewise.
+ * symfile.h (gdb_bfd_open_maybe_remote): Remove declaration.
+ * symfile.c (separate_debug_file_exists): Use gdb_bfd_open.
+ (gdb_bfd_open_maybe_remote): Remove function.
+ (symfile_bfd_open): Replace remote filename check with
+ target filename check.
+ (reread_symbols): Use gdb_bfd_open.
+ * build-id.c (gdbcore.h): New include.
+ (build_id_to_debug_bfd): Use gdb_bfd_open.
+ * infcmd.c (attach_command_post_wait): Remove remote filename
+ check.
+ * solib.c (solib_find): Replace remote-specific handling with
+ target-specific handling. Update comments where necessary.
+ (solib_bfd_open): Replace remote-specific handling with
+ target-specific handling.
+ (gdb_sysroot_changed): New function.
+ (_initialize_solib): Call the above when gdb_sysroot changes.
+ * windows-tdep.c (gdbcore.h): New include.
+ (windows_xfer_shared_library): Use gdb_bfd_open.
+
+2015-04-02 Gary Benson <gbenson@redhat.com>
+
* gdb/gdb_bfd.h (TARGET_SYSROOT_PREFIX): New definition.
(is_target_filename): New declaration.
(gdb_bfd_has_target_filename): Likewise.
diff --git a/gdb/build-id.c b/gdb/build-id.c
index 3a6ebb1cf34..8f7bbb4d9d0 100644
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -26,6 +26,7 @@
#include "symfile.h"
#include "objfiles.h"
#include "filenames.h"
+#include "gdbcore.h"
/* See build-id.h. */
@@ -118,7 +119,7 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
continue;
/* We expect to be silent on the non-existing files. */
- abfd = gdb_bfd_open_maybe_remote (filename);
+ abfd = gdb_bfd_open (filename, gnutarget, -1);
if (abfd == NULL)
continue;
diff --git a/gdb/remote.c b/gdb/remote.c
index 43f3165122d..69a67a85063 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -10180,113 +10180,6 @@ remote_hostio_close_cleanup (void *opaque)
remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno);
}
-
-static void *
-remote_bfd_iovec_open (struct bfd *abfd, void *open_closure)
-{
- const char *filename = bfd_get_filename (abfd);
- int fd, remote_errno;
- int *stream;
-
- gdb_assert (remote_filename_p (filename));
-
- fd = remote_hostio_open (find_target_at (process_stratum),
- filename + 7, FILEIO_O_RDONLY, 0, &remote_errno);
- if (fd == -1)
- {
- errno = remote_fileio_errno_to_host (remote_errno);
- bfd_set_error (bfd_error_system_call);
- return NULL;
- }
-
- stream = xmalloc (sizeof (int));
- *stream = fd;
- return stream;
-}
-
-static int
-remote_bfd_iovec_close (struct bfd *abfd, void *stream)
-{
- int fd = *(int *)stream;
- int remote_errno;
-
- xfree (stream);
-
- /* Ignore errors on close; these may happen if the remote
- connection was already torn down. */
- remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno);
-
- /* Zero means success. */
- return 0;
-}
-
-static file_ptr
-remote_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
- file_ptr nbytes, file_ptr offset)
-{
- int fd = *(int *)stream;
- int remote_errno;
- file_ptr pos, bytes;
-
- pos = 0;
- while (nbytes > pos)
- {
- bytes = remote_hostio_pread (find_target_at (process_stratum),
- fd, (gdb_byte *) buf + pos, nbytes - pos,
- offset + pos, &remote_errno);
- if (bytes == 0)
- /* Success, but no bytes, means end-of-file. */
- break;
- if (bytes == -1)
- {
- errno = remote_fileio_errno_to_host (remote_errno);
- bfd_set_error (bfd_error_system_call);
- return -1;
- }
-
- pos += bytes;
- }
-
- return pos;
-}
-
-static int
-remote_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
-{
- int fd = *(int *) stream;
- int remote_errno;
- int result;
-
- result = remote_hostio_fstat (find_target_at (process_stratum),
- fd, sb, &remote_errno);
-
- if (result == -1)
- {
- errno = remote_fileio_errno_to_host (remote_errno);
- bfd_set_error (bfd_error_system_call);
- }
-
- return result;
-}
-
-int
-remote_filename_p (const char *filename)
-{
- return startswith (filename, REMOTE_SYSROOT_PREFIX);
-}
-
-bfd *
-remote_bfd_open (const char *remote_file, const char *target)
-{
- bfd *abfd = gdb_bfd_openr_iovec (remote_file, target,
- remote_bfd_iovec_open, NULL,
- remote_bfd_iovec_pread,
- remote_bfd_iovec_close,
- remote_bfd_iovec_stat);
-
- return abfd;
-}
-
void
remote_file_put (const char *local_file, const char *remote_file, int from_tty)
{
diff --git a/gdb/remote.h b/gdb/remote.h
index e6475377185..fb2a72b5950 100644
--- a/gdb/remote.h
+++ b/gdb/remote.h
@@ -49,17 +49,6 @@ void remote_file_get (const char *remote_file, const char *local_file,
int from_tty);
void remote_file_delete (const char *remote_file, int from_tty);
-bfd *remote_bfd_open (const char *remote_file, const char *target);
-
-/* If a path starts with this sequence, GDB will retrieve the target
- libraries from the remote system. */
-
-#define REMOTE_SYSROOT_PREFIX "remote:"
-
-/* True if FILENAME starts with REMOTE_SYSROOT_PREFIX. */
-
-int remote_filename_p (const char *filename);
-
extern int remote_register_number_and_offset (struct gdbarch *gdbarch,
int regnum, int *pnum,
int *poffset);
diff --git a/gdb/solib.c b/gdb/solib.c
index c8138ef7a89..2ec265a9aaf 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -236,17 +236,17 @@ solib_find (char *in_pathname, int *fd)
|-----------------+-----------+----------------|
| /some/dir | / | c:/foo/bar.dll |
| /some/dir | | /foo/bar.dll |
- | remote: | | c:/foo/bar.dll |
- | remote: | | /foo/bar.dll |
- | remote:some/dir | / | c:/foo/bar.dll |
- | remote:some/dir | | /foo/bar.dll |
+ | target: | | c:/foo/bar.dll |
+ | target: | | /foo/bar.dll |
+ | target:some/dir | / | c:/foo/bar.dll |
+ | target:some/dir | | /foo/bar.dll |
IOW, we don't need to add a separator if IN_PATHNAME already
- has one, or when the the sysroot is exactly "remote:".
+ has one, or when the the sysroot is exactly "target:".
There's no need to check for drive spec explicitly, as we only
get here if IN_PATHNAME is considered an absolute path. */
need_dir_separator = !(IS_DIR_SEPARATOR (in_pathname[0])
- || strcmp (REMOTE_SYSROOT_PREFIX, sysroot) == 0);
+ || strcmp (TARGET_SYSROOT_PREFIX, sysroot) == 0);
/* Cat the prefixed pathname together. */
temp_pathname = concat (sysroot,
@@ -254,8 +254,8 @@ solib_find (char *in_pathname, int *fd)
in_pathname, (char *) NULL);
}
- /* Handle remote files. */
- if (remote_filename_p (temp_pathname))
+ /* Handle files to be accessed via the target. */
+ if (is_target_filename (temp_pathname))
{
*fd = -1;
do_cleanups (old_chain);
@@ -382,20 +382,10 @@ solib_find (char *in_pathname, int *fd)
bfd *
solib_bfd_fopen (char *pathname, int fd)
{
- bfd *abfd;
+ bfd *abfd = gdb_bfd_open (pathname, gnutarget, fd);
- if (remote_filename_p (pathname))
- {
- gdb_assert (fd == -1);
- abfd = remote_bfd_open (pathname, gnutarget);
- }
- else
- {
- abfd = gdb_bfd_open (pathname, gnutarget, fd);
-
- if (abfd)
- bfd_set_cacheable (abfd, 1);
- }
+ if (abfd != NULL && !gdb_bfd_has_target_filename (abfd))
+ bfd_set_cacheable (abfd, 1);
if (!abfd)
{
@@ -1403,6 +1393,36 @@ reload_shared_libraries (char *ignored, int from_tty,
ops->special_symbol_handling ();
}
+/* Wrapper for reload_shared_libraries that replaces "remote:"
+ at the start of gdb_sysroot with "target:". */
+
+static void
+gdb_sysroot_changed (char *ignored, int from_tty,
+ struct cmd_list_element *e)
+{
+ const char *old_prefix = "remote:";
+ const char *new_prefix = TARGET_SYSROOT_PREFIX;
+
+ if (startswith (gdb_sysroot, old_prefix))
+ {
+ static int warning_issued = 0;
+
+ gdb_assert (strlen (old_prefix) == strlen (new_prefix));
+ memcpy (gdb_sysroot, new_prefix, strlen (new_prefix));
+
+ if (!warning_issued)
+ {
+ warning (_("\"%s\" is deprecated, use \"%s\" instead."),
+ old_prefix, new_prefix);
+ warning (_("sysroot set to \"%s\"."), gdb_sysroot);
+
+ warning_issued = 1;
+ }
+ }
+
+ reload_shared_libraries (ignored, from_tty, e);
+}
+
static void
show_auto_solib_add (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
@@ -1597,7 +1617,7 @@ Show the current system root."), _("\
The system root is used to load absolute shared library symbol files.\n\
For other (relative) files, you can add directories using\n\
`set solib-search-path'."),
- reload_shared_libraries,
+ gdb_sysroot_changed,
NULL,
&setlist, &showlist);
diff --git a/gdb/symfile.c b/gdb/symfile.c
index ba099d3a29b..0d8dae7c360 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1368,7 +1368,7 @@ separate_debug_file_exists (const char *name, unsigned long crc,
if (filename_cmp (name, objfile_name (parent_objfile)) == 0)
return 0;
- abfd = gdb_bfd_open_maybe_remote (name);
+ abfd = gdb_bfd_open (name, gnutarget, -1);
if (!abfd)
return 0;
@@ -1712,23 +1712,6 @@ set_initial_language (void)
expected_language = current_language; /* Don't warn the user. */
}
-/* If NAME is a remote name open the file using remote protocol, otherwise
- open it normally. Returns a new reference to the BFD. On error,
- returns NULL with the BFD error set. */
-
-bfd *
-gdb_bfd_open_maybe_remote (const char *name)
-{
- bfd *result;
-
- if (remote_filename_p (name))
- result = remote_bfd_open (name, gnutarget);
- else
- result = gdb_bfd_open (name, gnutarget, -1);
-
- return result;
-}
-
/* Open the file specified by NAME and hand it off to BFD for
preliminary analysis. Return a newly initialized bfd *, which
includes a newly malloc'd` copy of NAME (tilde-expanded and made
@@ -1742,9 +1725,9 @@ symfile_bfd_open (const char *cname)
char *name, *absolute_name;
struct cleanup *back_to;
- if (remote_filename_p (cname))
+ if (is_target_filename (cname))
{
- sym_bfd = remote_bfd_open (cname, gnutarget);
+ sym_bfd = gdb_bfd_open (cname, gnutarget, -1);
if (!sym_bfd)
error (_("`%s': can't open to read symbols: %s."), cname,
bfd_errmsg (bfd_get_error ()));
@@ -2596,7 +2579,7 @@ reread_symbols (void)
obfd_filename = bfd_get_filename (objfile->obfd);
/* Open the new BFD before freeing the old one, so that
the filename remains live. */
- objfile->obfd = gdb_bfd_open_maybe_remote (obfd_filename);
+ objfile->obfd = gdb_bfd_open (obfd_filename, gnutarget, -1);
if (objfile->obfd == NULL)
{
/* We have to make a cleanup and error here, rather
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 7b66c62f8ff..9ef3f0baee6 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -514,8 +514,6 @@ extern void find_lowest_section (bfd *, asection *, void *);
extern bfd *symfile_bfd_open (const char *);
-extern bfd *gdb_bfd_open_maybe_remote (const char *);
-
extern int get_section_index (struct objfile *, char *);
extern int print_symbol_loading_p (int from_tty, int mainline, int full);
diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c
index fbdddc99ec9..dc4e2e43c1c 100644
--- a/gdb/windows-tdep.c
+++ b/gdb/windows-tdep.c
@@ -33,6 +33,7 @@
#include "complaints.h"
#include "solib.h"
#include "solib-target.h"
+#include "gdbcore.h"
struct cmd_list_element *info_w32_cmdlist;
@@ -401,7 +402,7 @@ windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr,
obstack_grow_str (obstack, p);
xfree (p);
obstack_grow_str (obstack, "\"><segment address=\"");
- dll = gdb_bfd_open_maybe_remote (so_name);
+ dll = gdb_bfd_open (so_name, gnutarget, -1);
/* The following calls are OK even if dll is NULL.
The default value 0x1000 is returned by pe_text_section_offset
in that case. */