diff options
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index ed684a2..fc45133 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -474,15 +474,15 @@ solib_find (const char *in_pathname, int *fd) function. If unsuccessful, the FD will be closed (unless FD was -1). */ -bfd * +gdb_bfd_ref_ptr solib_bfd_fopen (char *pathname, int fd) { - bfd *abfd = gdb_bfd_open (pathname, gnutarget, fd); + gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd)); - if (abfd != NULL && !gdb_bfd_has_target_filename (abfd)) - bfd_set_cacheable (abfd, 1); + if (abfd != NULL && !gdb_bfd_has_target_filename (abfd.get ())) + bfd_set_cacheable (abfd.get (), 1); - if (!abfd) + if (abfd == NULL) { make_cleanup (xfree, pathname); error (_("Could not open `%s' as an executable file: %s"), @@ -496,12 +496,11 @@ solib_bfd_fopen (char *pathname, int fd) /* Find shared library PATHNAME and open a BFD for it. */ -bfd * +gdb_bfd_ref_ptr solib_bfd_open (char *pathname) { char *found_pathname; int found_file; - bfd *abfd; const struct bfd_arch_info *b; /* Search for shared library file. */ @@ -517,22 +516,20 @@ solib_bfd_open (char *pathname) } /* Open bfd for shared library. */ - abfd = solib_bfd_fopen (found_pathname, found_file); + gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname, found_file)); /* Check bfd format. */ - if (!bfd_check_format (abfd, bfd_object)) - { - make_cleanup_bfd_unref (abfd); - error (_("`%s': not in executable format: %s"), - bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); - } + if (!bfd_check_format (abfd.get (), bfd_object)) + error (_("`%s': not in executable format: %s"), + bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); /* Check bfd arch. */ b = gdbarch_bfd_arch_info (target_gdbarch ()); - if (!b->compatible (b, bfd_get_arch_info (abfd))) + if (!b->compatible (b, bfd_get_arch_info (abfd.get ()))) warning (_("`%s': Shared library architecture %s is not compatible " "with target architecture %s."), bfd_get_filename (abfd), - bfd_get_arch_info (abfd)->printable_name, b->printable_name); + bfd_get_arch_info (abfd.get ())->printable_name, + b->printable_name); return abfd; } @@ -556,18 +553,17 @@ solib_map_sections (struct so_list *so) char *filename; struct target_section *p; struct cleanup *old_chain; - bfd *abfd; filename = tilde_expand (so->so_name); old_chain = make_cleanup (xfree, filename); - abfd = ops->bfd_open (filename); + gdb_bfd_ref_ptr abfd (ops->bfd_open (filename)); do_cleanups (old_chain); if (abfd == NULL) return 0; /* Leave bfd open, core_xfer_memory and "info files" need it. */ - so->abfd = abfd; + so->abfd = abfd.release (); /* Copy the full path name into so_name, allowing symbol_file_add to find it later. This also affects the =library-loaded GDB/MI @@ -575,14 +571,14 @@ solib_map_sections (struct so_list *so) the library's host-side path. If we let the target dictate that objfile's path, and the target is different from the host, GDB/MI will not provide the correct host-side path. */ - if (strlen (bfd_get_filename (abfd)) >= SO_NAME_MAX_PATH_SIZE) + if (strlen (bfd_get_filename (so->abfd)) >= SO_NAME_MAX_PATH_SIZE) error (_("Shared library file name is too long.")); - strcpy (so->so_name, bfd_get_filename (abfd)); + strcpy (so->so_name, bfd_get_filename (so->abfd)); - if (build_section_table (abfd, &so->sections, &so->sections_end)) + if (build_section_table (so->abfd, &so->sections, &so->sections_end)) { error (_("Can't find the file sections in `%s': %s"), - bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); + bfd_get_filename (so->abfd), bfd_errmsg (bfd_get_error ())); } for (p = so->sections; p < so->sections_end; p++) @@ -1346,7 +1342,6 @@ reload_shared_libraries_1 (int from_tty) for (so = so_list_head; so != NULL; so = so->next) { char *filename, *found_pathname = NULL; - bfd *abfd; int was_loaded = so->symbols_loaded; symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET; @@ -1355,12 +1350,11 @@ reload_shared_libraries_1 (int from_tty) filename = tilde_expand (so->so_original_name); make_cleanup (xfree, filename); - abfd = solib_bfd_open (filename); + gdb_bfd_ref_ptr abfd (solib_bfd_open (filename)); if (abfd != NULL) { - found_pathname = xstrdup (bfd_get_filename (abfd)); + found_pathname = xstrdup (bfd_get_filename (abfd.get ())); make_cleanup (xfree, found_pathname); - gdb_bfd_unref (abfd); } /* If this shared library is no longer associated with its previous |