bfd *
solib_bfd_open (char *pathname)
{
- struct target_so_ops *ops = solib_ops (target_gdbarch);
char *found_pathname;
int found_file;
bfd *abfd;
-
- /* Use target-specific override if present. */
- if (ops->bfd_open)
- return ops->bfd_open (pathname);
+ const struct bfd_arch_info *b;
/* Search for shared library file. */
found_pathname = solib_find (pathname, &found_file);
found_pathname, bfd_errmsg (bfd_get_error ()));
}
+ /* Check bfd arch. */
+ b = gdbarch_bfd_arch_info (target_gdbarch);
+ if (b->compatible (b, bfd_get_arch_info (abfd)) != b)
+ warning (_("`%s': Shared library architecture %s is not compatible "
+ "with target architecture %s."), found_pathname,
+ bfd_get_arch_info (abfd)->printable_name, b->printable_name);
+
return abfd;
}
solib_map_sections (void *arg)
{
struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
+ struct target_so_ops *ops = solib_ops (target_gdbarch);
char *filename;
struct target_section *p;
struct cleanup *old_chain;
filename = tilde_expand (so->so_name);
old_chain = make_cleanup (xfree, filename);
- abfd = solib_bfd_open (filename);
+ abfd = ops->bfd_open (filename);
do_cleanups (old_chain);
/* Leave bfd open, core_xfer_memory and "info files" need it. */
for (p = so->sections; p < so->sections_end; p++)
{
- struct target_so_ops *ops = solib_ops (target_gdbarch);
-
/* Relocate the section binding addresses as recorded in the shared
object's file by the base address to which the object was actually
mapped. */
free_so (struct so_list *so)
{
struct target_so_ops *ops = solib_ops (target_gdbarch);
- char *bfd_filename = 0;
if (so->sections)
xfree (so->sections);
-
- if (so->abfd)
- {
- bfd_filename = bfd_get_filename (so->abfd);
- if (! bfd_close (so->abfd))
- warning (_("cannot close \"%s\": %s"),
- bfd_filename, bfd_errmsg (bfd_get_error ()));
- }
- if (bfd_filename)
- xfree (bfd_filename);
+ gdb_bfd_unref (so->abfd);
ops->free_so (so);
symbol_add_stub (struct so_list *so, int flags)
{
struct section_addr_info *sap;
+ int *p_refcount;
/* Have we already loaded this shared object? */
ALL_OBJFILES (so->objfile)
sap = build_section_addr_info_from_section_table (so->sections,
so->sections_end);
- so->objfile = symbol_file_add_from_bfd (so->abfd, flags,
- sap, OBJF_SHARED | OBJF_KEEPBFD);
+ so->objfile = symbol_file_add_from_bfd (so->abfd, flags, sap, OBJF_SHARED);
+ p_refcount = xmalloc (sizeof (*p_refcount));
+ *p_refcount = 2; /* Both solib and objfile refer to this abfd. */
+ bfd_usrdata (so->abfd) = p_refcount;
+
free_section_addr_info (sap);
return;