aboutsummaryrefslogtreecommitdiff
path: root/gdb/solib-darwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/solib-darwin.c')
-rw-r--r--gdb/solib-darwin.c65
1 files changed, 23 insertions, 42 deletions
diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
index 4c5be24..232641b 100644
--- a/gdb/solib-darwin.c
+++ b/gdb/solib-darwin.c
@@ -427,7 +427,7 @@ darwin_in_dynsym_resolve_code (CORE_ADDR pc)
counting properly. This will either return NULL, or return a new
reference to a BFD. */
-static bfd *
+static gdb_bfd_ref_ptr
gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
const bfd_arch_info_type *arch)
{
@@ -441,7 +441,7 @@ gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
else
gdb_bfd_mark_parent (result, abfd);
- return result;
+ return gdb_bfd_ref_ptr (result);
}
/* Extract dyld_all_image_addr when the process was just created, assuming the
@@ -452,8 +452,6 @@ darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
{
char *interp_name;
CORE_ADDR load_addr = 0;
- bfd *dyld_bfd = NULL;
- struct cleanup *cleanup;
/* This method doesn't work with an attached process. */
if (current_inferior ()->attach_flag)
@@ -464,42 +462,30 @@ darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
if (!interp_name)
return;
- cleanup = make_cleanup (null_cleanup, NULL);
-
/* Create a bfd for the interpreter. */
- dyld_bfd = gdb_bfd_open (interp_name, gnutarget, -1);
- if (dyld_bfd)
+ gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget, -1));
+ if (dyld_bfd != NULL)
{
- bfd *sub;
-
- make_cleanup_bfd_unref (dyld_bfd);
- sub = gdb_bfd_mach_o_fat_extract
- (dyld_bfd, bfd_object, gdbarch_bfd_arch_info (target_gdbarch ()));
- if (sub)
- {
- dyld_bfd = sub;
- make_cleanup_bfd_unref (sub);
- }
+ gdb_bfd_ref_ptr sub
+ (gdb_bfd_mach_o_fat_extract (dyld_bfd.get (), bfd_object,
+ gdbarch_bfd_arch_info (target_gdbarch ())));
+ if (sub != NULL)
+ dyld_bfd = sub;
else
- dyld_bfd = NULL;
- }
- if (!dyld_bfd)
- {
- do_cleanups (cleanup);
- return;
+ dyld_bfd.release ();
}
+ if (dyld_bfd == NULL)
+ return;
/* We find the dynamic linker's base address by examining
the current pc (which should point at the entry point for the
dynamic linker) and subtracting the offset of the entry point. */
load_addr = (regcache_read_pc (get_current_regcache ())
- - bfd_get_start_address (dyld_bfd));
+ - bfd_get_start_address (dyld_bfd.get ()));
/* Now try to set a breakpoint in the dynamic linker. */
info->all_image_addr =
- lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
-
- do_cleanups (cleanup);
+ lookup_symbol_from_bfd (dyld_bfd.get (), "_dyld_all_image_infos");
if (info->all_image_addr == 0)
return;
@@ -634,13 +620,11 @@ darwin_lookup_lib_symbol (struct objfile *objfile,
return (struct block_symbol) {NULL, NULL};
}
-static bfd *
+static gdb_bfd_ref_ptr
darwin_bfd_open (char *pathname)
{
char *found_pathname;
int found_file;
- bfd *abfd;
- bfd *res;
/* Search for shared library file. */
found_pathname = solib_find (pathname, &found_file);
@@ -648,24 +632,21 @@ darwin_bfd_open (char *pathname)
perror_with_name (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));
- res = gdb_bfd_mach_o_fat_extract (abfd, bfd_object,
- gdbarch_bfd_arch_info (target_gdbarch ()));
- if (!res)
- {
- make_cleanup_bfd_unref (abfd);
- error (_("`%s': not a shared-library: %s"),
- bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
- }
+ gdb_bfd_ref_ptr res
+ (gdb_bfd_mach_o_fat_extract (abfd.get (), bfd_object,
+ gdbarch_bfd_arch_info (target_gdbarch ())));
+ if (res == NULL)
+ error (_("`%s': not a shared-library: %s"),
+ bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
/* The current filename for fat-binary BFDs is a name generated
by BFD, usually a string containing the name of the architecture.
Reset its value to the actual filename. */
- xfree (bfd_get_filename (res));
+ xfree (bfd_get_filename (res.get ()));
res->filename = xstrdup (pathname);
- gdb_bfd_unref (abfd);
return res;
}