aboutsummaryrefslogtreecommitdiff
path: root/gdb/solib.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/solib.c')
-rw-r--r--gdb/solib.c100
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);
}