configuration needs to call set_solib_ops. */
struct target_so_ops *current_target_so_ops;
-/* List of known shared objects */
-#define so_list_head current_program_space->so_list
-
/* Local function prototypes */
/* If non-empty, this is a search path for loading non-absolute shared library
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"),
/* 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. */
}
/* 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;
}
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
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++)
return 0;
}
-/* Synchronize GDB's shared object list with inferior's.
-
- Extract the list of currently loaded shared objects from the
- inferior, and compare it with the list of shared objects currently
- in GDB's so_list_head list. Edit so_list_head to bring it in sync
- with the inferior's new list.
-
- If we notice that the inferior has unloaded some shared objects,
- free any symbolic info GDB had read about those shared objects.
-
- Don't load symbolic info for any new shared objects; just add them
- to the list, and leave their symbols_loaded flag clear.
-
- If FROM_TTY is non-null, feel free to print messages about what
- we're doing.
-
- If TARGET is non-null, add the sections of all new shared objects
- to TARGET's section table. Note that this doesn't remove any
- sections for shared objects that have been unloaded, and it
- doesn't check to see if the new shared objects are already present in
- the section table. But we only use this for core files and
- processes we've just attached to, so that's okay. */
+/* See solib.h. */
-static void
-update_solib_list (int from_tty, struct target_ops *target)
+void
+update_solib_list (int from_tty)
{
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
struct so_list *inferior = ops->current_sos();
If READSYMS is 0, defer reading symbolic information until later
but still do any needed low level processing.
- FROM_TTY and TARGET are as described for update_solib_list, above. */
+ FROM_TTY is described for update_solib_list, above. */
void
-solib_add (const char *pattern, int from_tty,
- struct target_ops *target, int readsyms)
+solib_add (const char *pattern, int from_tty, int readsyms)
{
struct so_list *gdb;
error (_("Invalid regexp: %s"), re_err);
}
- update_solib_list (from_tty, target);
+ update_solib_list (from_tty);
/* Walk the list of currently loaded shared libraries, and read
symbols for any that match the pattern --- or any whose symbols
/* "0x", a little whitespace, and two hex digits per byte of pointers. */
addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
- update_solib_list (from_tty, 0);
+ update_solib_list (from_tty);
/* make_cleanup_ui_out_table_begin_end needs to know the number of
rows, so we need to make two passes over the libs. */
uiout->table_body ();
- for (so = so_list_head; so; so = so->next)
+ ALL_SO_LIBS (so)
{
struct cleanup *lib_cleanup;
sharedlibrary_command (char *args, int from_tty)
{
dont_repeat ();
- solib_add (args, from_tty, (struct target_ops *) 0, 1);
+ solib_add (args, from_tty, 1);
}
/* Implements the command "nosharedlibrary", which discards symbols
be adding them automatically. Switch terminal for any messages
produced by breakpoint_re_set. */
target_terminal_ours_for_output ();
- solib_add (NULL, 0, ¤t_target, auto_solib_add);
+ solib_add (NULL, 0, auto_solib_add);
target_terminal_inferior ();
}
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;
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
removed. Call it only after the solib target has been initialized by
solib_create_inferior_hook. */
- solib_add (NULL, 0, NULL, auto_solib_add);
+ solib_add (NULL, 0, auto_solib_add);
breakpoint_re_set ();