diff options
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 100 |
1 files changed, 57 insertions, 43 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index 1812ead..7ca3a42 100644 --- a/gdb/solib.c +++ b/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 ())); + } + + 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 found_file; + + 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); } |