mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-05 21:50:21 +08:00
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:
100
gdb/solib.c
100
gdb/solib.c
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user