X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-darwin.c;h=d66938fb90561ad90583fa58cc79722b24463e18;hb=632e107b32c0fe8aede62e070b00756e9fdd2c01;hp=cd5dc8dc9f10aad923b776d30b6d3126aff2b338;hpb=870f88f7551b0f2d6aaaa36fb684b5ff8f468107;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c index cd5dc8dc9f..d66938fb90 100644 --- a/gdb/solib-darwin.c +++ b/gdb/solib-darwin.c @@ -1,6 +1,6 @@ /* Handle Darwin shared libraries for GDB, the GNU Debugger. - Copyright (C) 2009-2016 Free Software Foundation, Inc. + Copyright (C) 2009-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -67,7 +67,7 @@ struct gdb_dyld_all_image_infos /* Current all_image_infos version. */ #define DYLD_VERSION_MIN 1 -#define DYLD_VERSION_MAX 14 +#define DYLD_VERSION_MAX 15 /* Per PSPACE specific data. */ struct darwin_info @@ -153,24 +153,16 @@ darwin_load_image_infos (struct darwin_info *info) /* Link map info to include in an allocated so_list entry. */ -struct lm_info +struct lm_info_darwin : public lm_info_base { /* The target location of lm. */ - CORE_ADDR lm_addr; -}; - -struct darwin_so_list -{ - /* Common field. */ - struct so_list sl; - /* Darwin specific data. */ - struct lm_info li; + CORE_ADDR lm_addr = 0; }; /* Lookup the value for a specific symbol. */ static CORE_ADDR -lookup_symbol_from_bfd (bfd *abfd, char *symname) +lookup_symbol_from_bfd (bfd *abfd, const char *symname) { long storage_needed; asymbol **symbol_table; @@ -230,7 +222,7 @@ find_program_interpreter (void) Note that darwin-nat.c implements pid_to_exec_file. */ static int -open_symbol_file_object (void *from_ttyp) +open_symbol_file_object (int from_tty) { return 0; } @@ -269,9 +261,8 @@ darwin_current_sos (void) CORE_ADDR path_addr; struct mach_o_header_external hdr; unsigned long hdr_val; - char *file_path; + gdb::unique_xmalloc_ptr file_path; int errcode; - struct darwin_so_list *dnew; struct so_list *newobj; struct cleanup *old_chain; @@ -302,17 +293,16 @@ darwin_current_sos (void) break; /* Create and fill the new so_list element. */ - dnew = XCNEW (struct darwin_so_list); - newobj = &dnew->sl; - old_chain = make_cleanup (xfree, dnew); + newobj = XCNEW (struct so_list); + old_chain = make_cleanup (xfree, newobj); - newobj->lm_info = &dnew->li; + lm_info_darwin *li = new lm_info_darwin; + newobj->lm_info = li; - strncpy (newobj->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1); + strncpy (newobj->so_name, file_path.get (), SO_NAME_MAX_PATH_SIZE - 1); newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; strcpy (newobj->so_original_name, newobj->so_name); - xfree (file_path); - newobj->lm_info->lm_addr = load_addr; + li->lm_addr = load_addr; if (head == NULL) head = newobj; @@ -423,19 +413,11 @@ darwin_in_dynsym_resolve_code (CORE_ADDR pc) return 0; } - -/* No special symbol handling. */ - -static void -darwin_special_symbol_handling (void) -{ -} - /* A wrapper for bfd_mach_o_fat_extract that handles reference 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) { @@ -449,7 +431,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 @@ -460,8 +442,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) @@ -472,42 +452,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; @@ -609,6 +577,9 @@ darwin_clear_solib (void) static void darwin_free_so (struct so_list *so) { + lm_info_darwin *li = (lm_info_darwin *) so->lm_info; + + delete li; } /* The section table is built from bfd sections using bfd VMAs. @@ -618,8 +589,10 @@ static void darwin_relocate_section_addresses (struct so_list *so, struct target_section *sec) { - sec->addr += so->lm_info->lm_addr; - sec->endaddr += so->lm_info->lm_addr; + lm_info_darwin *li = (lm_info_darwin *) so->lm_info; + + sec->addr += li->lm_addr; + sec->endaddr += li->lm_addr; /* Best effort to set addr_high/addr_low. This is used only by 'info sharedlibary'. */ @@ -642,46 +615,38 @@ darwin_lookup_lib_symbol (struct objfile *objfile, return (struct block_symbol) {NULL, NULL}; } -static bfd * -darwin_bfd_open (char *pathname) +static gdb_bfd_ref_ptr +darwin_bfd_open (const char *pathname) { - char *found_pathname; int found_file; - bfd *abfd; - bfd *res; /* Search for shared library file. */ - found_pathname = solib_find (pathname, &found_file); + gdb::unique_xmalloc_ptr found_pathname + = solib_find (pathname, &found_file); if (found_pathname == NULL) 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.get (), 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; } struct target_so_ops darwin_so_ops; -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_darwin_solib; - void _initialize_darwin_solib (void) { @@ -693,7 +658,6 @@ _initialize_darwin_solib (void) darwin_so_ops.free_so = darwin_free_so; darwin_so_ops.clear_solib = darwin_clear_solib; darwin_so_ops.solib_create_inferior_hook = darwin_solib_create_inferior_hook; - darwin_so_ops.special_symbol_handling = darwin_special_symbol_handling; darwin_so_ops.current_sos = darwin_current_sos; darwin_so_ops.open_symbol_file_object = open_symbol_file_object; darwin_so_ops.in_dynsym_resolve_code = darwin_in_dynsym_resolve_code;