ChangeLog:

* remote.h (remote_filename_p, remote_bfd_open): Add prototypes.
	* remote.c (remote_bfd_iovec_open, remote_bfd_iovec_close,
	remote_bfd_iovec_pread, remote_bfd_iovec_stat, remote_filename_p,
	remote_bfd_open): New functions.
	(remote_hostio_send_command): Fail safely if remote connection
	is not set up.

	* solist.h (solib_open): Remove prototype.
	(solib_bfd_open): Add prototype.
	* solib.c: Include "remote.h".
	(solib_open): Remove, replace by ...
	(solib_bfd_open): ... this new function.  Handle remote BFDs.
	(solib_map_sections): Replace solib_open by solib_bfd_open.
	* solib-frv.c: Include "exceptions.h".
	(enable_break2): Replace solib_open by solib_bfd_open.
	* solib-svr4.c: Include "exceptions.h".
	(enable_break): Replace solib_open by solib_bfd_open.

	* symfile.c: Include "remote.h".
	(build_id_verify): Handle remote BFDs.
	(separate_debug_file_exists): Use BFD to access file.  Handle
	remote BFDs.
	(symfile_bfd_open): Handle remote BFDs.
	(reread_symbols): Handle remote BFDs.

	* NEWS: Mention "remote:" argument prefix to "set sysroot".

doc/ChangeLog:

	* gdb.texinfo (Commands to Specify Files): Document "remote:"
	argument prefix to "set sysroot".
This commit is contained in:
Ulrich Weigand
2008-08-26 17:30:35 +00:00
parent 1cf3db46a6
commit f1838a9841
11 changed files with 263 additions and 86 deletions

View File

@ -44,6 +44,7 @@
#include "solist.h"
#include "observer.h"
#include "readline/readline.h"
#include "remote.h"
/* Architecture-specific operations. */
@ -106,11 +107,11 @@ The search path for loading non-absolute shared library symbol files is %s.\n"),
GLOBAL FUNCTION
solib_open -- Find a shared library file and open it.
solib_bfd_open -- Find a shared library file and open BFD for it.
SYNOPSIS
int solib_open (char *in_patname, char **found_pathname);
struct bfd *solib_open (char *in_pathname);
DESCRIPTION
@ -137,16 +138,17 @@ The search path for loading non-absolute shared library symbol files is %s.\n"),
RETURNS
file handle for opened solib, or -1 for failure. */
BFD file handle for opened solib; throws error on failure. */
int
solib_open (char *in_pathname, char **found_pathname)
bfd *
solib_bfd_open (char *in_pathname)
{
struct target_so_ops *ops = solib_ops (target_gdbarch);
int found_file = -1;
char *temp_pathname = NULL;
char *p = in_pathname;
int gdb_sysroot_is_empty;
bfd *abfd;
gdb_sysroot_is_empty = (gdb_sysroot == NULL || *gdb_sysroot == 0);
@ -168,6 +170,29 @@ solib_open (char *in_pathname, char **found_pathname)
strcat (temp_pathname, in_pathname);
}
/* Handle remote files. */
if (remote_filename_p (temp_pathname))
{
temp_pathname = xstrdup (temp_pathname);
abfd = remote_bfd_open (temp_pathname, gnutarget);
if (!abfd)
{
make_cleanup (xfree, temp_pathname);
error (_("Could not open `%s' as an executable file: %s"),
temp_pathname, bfd_errmsg (bfd_get_error ()));
}
if (!bfd_check_format (abfd, bfd_object))
{
bfd_close (abfd);
make_cleanup (xfree, temp_pathname);
error (_("`%s': not in executable format: %s"),
temp_pathname, bfd_errmsg (bfd_get_error ()));
}
return abfd;
}
/* Now see if we can open it. */
found_file = open (temp_pathname, O_RDONLY | O_BINARY, 0);
@ -228,16 +253,30 @@ solib_open (char *in_pathname, char **found_pathname)
OPF_TRY_CWD_FIRST, in_pathname, O_RDONLY | O_BINARY, 0,
&temp_pathname);
/* Done. If not found, tough luck. Return found_file and
(optionally) found_pathname. */
if (temp_pathname)
/* Done. If still not found, error. */
if (found_file < 0)
perror_with_name (in_pathname);
/* Leave temp_pathname allocated. abfd->name will point to it. */
abfd = bfd_fopen (temp_pathname, gnutarget, FOPEN_RB, found_file);
if (!abfd)
{
if (found_pathname != NULL)
*found_pathname = temp_pathname;
else
xfree (temp_pathname);
close (found_file);
make_cleanup (xfree, temp_pathname);
error (_("Could not open `%s' as an executable file: %s"),
temp_pathname, bfd_errmsg (bfd_get_error ()));
}
return found_file;
if (!bfd_check_format (abfd, bfd_object))
{
bfd_close (abfd);
make_cleanup (xfree, temp_pathname);
error (_("`%s': not in executable format: %s"),
temp_pathname, bfd_errmsg (bfd_get_error ()));
}
bfd_set_cacheable (abfd, 1);
return abfd;
}
@ -273,46 +312,24 @@ solib_map_sections (void *arg)
{
struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
char *filename;
char *scratch_pathname;
int scratch_chan;
struct section_table *p;
struct cleanup *old_chain;
bfd *abfd;
filename = tilde_expand (so->so_name);
old_chain = make_cleanup (xfree, filename);
scratch_chan = solib_open (filename, &scratch_pathname);
if (scratch_chan < 0)
{
perror_with_name (filename);
}
/* Leave scratch_pathname allocated. abfd->name will point to it. */
abfd = bfd_fopen (scratch_pathname, gnutarget, FOPEN_RB, scratch_chan);
if (!abfd)
{
close (scratch_chan);
error (_("Could not open `%s' as an executable file: %s"),
scratch_pathname, bfd_errmsg (bfd_get_error ()));
}
abfd = solib_bfd_open (filename);
do_cleanups (old_chain);
/* Leave bfd open, core_xfer_memory and "info files" need it. */
so->abfd = abfd;
bfd_set_cacheable (abfd, 1);
/* copy full path name into so_name, so that later symbol_file_add
can find it */
if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE)
error (_("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure."));
strcpy (so->so_name, scratch_pathname);
if (strlen (bfd_get_filename (abfd)) >= SO_NAME_MAX_PATH_SIZE)
error (_("Shared library file name is too long."));
strcpy (so->so_name, bfd_get_filename (abfd));
if (!bfd_check_format (abfd, bfd_object))
{
error (_("\"%s\": not in executable format: %s."),
scratch_pathname, bfd_errmsg (bfd_get_error ()));
}
if (build_section_table (abfd, &so->sections, &so->sections_end))
{
error (_("Can't find the file sections in `%s': %s"),
@ -339,9 +356,6 @@ solib_map_sections (void *arg)
}
}
/* Free the file names, close the file now. */
do_cleanups (old_chain);
return (1);
}