X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-frv.c;h=30662ba3b33e93bdf7ccab0780a1dc0f67367a58;hb=2b2798cc9716f45f752ea03411b6f9c9afc17cc6;hp=acb35a244bdb16984bd58afe1026ecff17e6437f;hpb=cb457ae2842770922180ce15b4885ff7b224bf95;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index acb35a244b..30662ba3b3 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -1,6 +1,5 @@ /* Handle FR-V (FDPIC) shared libraries for GDB, the GNU Debugger. - Copyright (C) 2004, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -19,7 +18,6 @@ #include "defs.h" -#include "gdb_string.h" #include "inferior.h" #include "gdbcore.h" #include "solib.h" @@ -31,10 +29,10 @@ #include "command.h" #include "gdbcmd.h" #include "elf/frv.h" -#include "exceptions.h" +#include "gdb_bfd.h" /* Flag which indicates whether internal debug messages should be printed. */ -static int solib_frv_debug; +static unsigned int solib_frv_debug; /* FR-V pointers are four bytes wide. */ enum { FRV_PTR_SIZE = 4 }; @@ -98,7 +96,7 @@ struct int_elf32_fdpic_loadmap { static struct int_elf32_fdpic_loadmap * fetch_loadmap (CORE_ADDR ldmaddr) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); struct ext_elf32_fdpic_loadmap ext_ldmbuf_partial; struct ext_elf32_fdpic_loadmap *ext_ldmbuf; struct int_elf32_fdpic_loadmap *int_ldmbuf; @@ -134,7 +132,7 @@ fetch_loadmap (CORE_ADDR ldmaddr) /* Allocate space for the complete (external) loadmap. */ ext_ldmbuf_size = sizeof (struct ext_elf32_fdpic_loadmap) + (nsegs - 1) * sizeof (struct ext_elf32_fdpic_loadseg); - ext_ldmbuf = xmalloc (ext_ldmbuf_size); + ext_ldmbuf = (struct ext_elf32_fdpic_loadmap *) xmalloc (ext_ldmbuf_size); /* Copy over the portion of the loadmap that's already been read. */ memcpy (ext_ldmbuf, &ext_ldmbuf_partial, sizeof ext_ldmbuf_partial); @@ -153,7 +151,7 @@ fetch_loadmap (CORE_ADDR ldmaddr) external loadsegs. I.e, allocate the internal loadsegs. */ int_ldmbuf_size = sizeof (struct int_elf32_fdpic_loadmap) + (nsegs - 1) * sizeof (struct int_elf32_fdpic_loadseg); - int_ldmbuf = xmalloc (int_ldmbuf_size); + int_ldmbuf = (struct int_elf32_fdpic_loadmap *) xmalloc (int_ldmbuf_size); /* Place extracted information in internal structs. */ int_ldmbuf->version = version; @@ -265,8 +263,8 @@ static CORE_ADDR main_lm_addr = 0; static CORE_ADDR lm_base (void) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); - struct minimal_symbol *got_sym; + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); + struct bound_minimal_symbol got_sym; CORE_ADDR addr; gdb_byte buf[FRV_PTR_SIZE]; @@ -284,7 +282,7 @@ lm_base (void) got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, symfile_objfile); - if (got_sym == 0) + if (got_sym.minsym == 0) { if (solib_frv_debug) fprintf_unfiltered (gdb_stdlog, @@ -292,7 +290,7 @@ lm_base (void) return 0; } - addr = SYMBOL_VALUE_ADDRESS (got_sym) + 8; + addr = BMSYMBOL_VALUE_ADDRESS (got_sym) + 8; if (solib_frv_debug) fprintf_unfiltered (gdb_stdlog, @@ -317,7 +315,7 @@ lm_base (void) static struct so_list * frv_current_sos (void) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); CORE_ADDR lm_addr, mgot; struct so_list *sos_head = NULL; struct so_list **sos_next_ptr = &sos_head; @@ -328,11 +326,11 @@ frv_current_sos (void) for details.) Note that the relocation of the main executable is also performed - by SOLIB_CREATE_INFERIOR_HOOK(), however, in the case of core + by solib_create_inferior_hook(), however, in the case of core files, this hook is called too late in order to be of benefit to - SOLIB_ADD. SOLIB_ADD eventually calls this this function, + solib_add. solib_add eventually calls this this function, frv_current_sos, and also precedes the call to - SOLIB_CREATE_INFERIOR_HOOK(). (See post_create_inferior() in + solib_create_inferior_hook(). (See post_create_inferior() in infcmd.c.) */ if (main_executable_lm_info == 0 && core_bfd != NULL) frv_relocate_main_executable (); @@ -390,8 +388,8 @@ frv_current_sos (void) break; } - sop = xcalloc (1, sizeof (struct so_list)); - sop->lm_info = xcalloc (1, sizeof (struct lm_info)); + sop = XCNEW (struct so_list); + sop->lm_info = XCNEW (struct lm_info); sop->lm_info->map = loadmap; sop->lm_info->got_value = got_addr; sop->lm_info->lm_addr = lm_addr; @@ -448,7 +446,7 @@ frv_in_dynsym_resolve_code (CORE_ADDR pc) { return ((pc >= interp_text_sect_low && pc < interp_text_sect_high) || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high) - || in_plt_section (pc, NULL)); + || in_plt_section (pc)); } /* Given a loadmap and an address, return the displacement needed @@ -486,7 +484,7 @@ enable_break_failure_warning (void) /* Helper function for gdb_bfd_lookup_symbol. */ static int -cmp_name (asymbol *sym, void *data) +cmp_name (const asymbol *sym, const void *data) { return (strcmp (sym->name, (const char *) data) == 0); } @@ -518,7 +516,7 @@ static int enable_break2_done = 0; static int enable_break2 (void) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); int success = 0; char **bkpt_namep; asection *interp_sect; @@ -535,18 +533,17 @@ enable_break2 (void) if (interp_sect) { unsigned int interp_sect_size; - gdb_byte *buf; + char *buf; bfd *tmp_bfd = NULL; int status; CORE_ADDR addr, interp_loadmap_addr; gdb_byte addr_buf[FRV_PTR_SIZE]; struct int_elf32_fdpic_loadmap *ldm; - volatile struct gdb_exception ex; /* Read the contents of the .interp section into a local buffer; the contents specify the dynamic linker this program uses. */ interp_sect_size = bfd_section_size (exec_bfd, interp_sect); - buf = alloca (interp_sect_size); + buf = (char *) alloca (interp_sect_size); bfd_get_section_contents (exec_bfd, interp_sect, buf, 0, interp_sect_size); @@ -559,23 +556,28 @@ enable_break2 (void) be trivial on GNU/Linux). Therefore, we have to try an alternate mechanism to find the dynamic linker's base address. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { tmp_bfd = solib_bfd_open (buf); } + CATCH (ex, RETURN_MASK_ALL) + { + } + END_CATCH + if (tmp_bfd == NULL) { enable_break_failure_warning (); return 0; } - status = frv_fdpic_loadmap_addresses (target_gdbarch, + status = frv_fdpic_loadmap_addresses (target_gdbarch (), &interp_loadmap_addr, 0); if (status < 0) { warning (_("Unable to determine dynamic linker loadmap address.")); enable_break_failure_warning (); - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); return 0; } @@ -590,7 +592,7 @@ enable_break2 (void) warning (_("Unable to load dynamic linker loadmap at address %s."), hex_string_custom (interp_loadmap_addr, 8)); enable_break_failure_warning (); - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); return 0; } @@ -624,7 +626,7 @@ enable_break2 (void) warning (_("Could not find symbol _dl_debug_addr " "in dynamic linker")); enable_break_failure_warning (); - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); return 0; } @@ -675,7 +677,7 @@ enable_break2 (void) "(at address %s) from dynamic linker"), hex_string_custom (addr + 8, 8)); enable_break_failure_warning (); - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); return 0; } addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order); @@ -687,13 +689,13 @@ enable_break2 (void) "(at address %s) from dynamic linker"), hex_string_custom (addr, 8)); enable_break_failure_warning (); - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); return 0; } addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order); /* We're done with the temporary bfd. */ - bfd_close (tmp_bfd); + gdb_bfd_unref (tmp_bfd); /* We're also done with the loadmap. */ xfree (ldm); @@ -703,7 +705,7 @@ enable_break2 (void) remove_solib_event_breakpoints (); /* Now (finally!) create the solib breakpoint. */ - create_solib_event_breakpoint (target_gdbarch, addr); + create_solib_event_breakpoint (target_gdbarch (), addr); enable_break2_done = 1; @@ -721,6 +723,7 @@ static int enable_break (void) { asection *interp_sect; + CORE_ADDR entry_point; if (symfile_objfile == NULL) { @@ -730,7 +733,7 @@ enable_break (void) return 0; } - if (!symfile_objfile->ei.entry_point_p) + if (!entry_point_address_query (&entry_point)) { if (solib_frv_debug) fprintf_unfiltered (gdb_stdlog, @@ -751,15 +754,13 @@ enable_break (void) return 0; } - create_solib_event_breakpoint (target_gdbarch, - symfile_objfile->ei.entry_point); + create_solib_event_breakpoint (target_gdbarch (), entry_point); if (solib_frv_debug) fprintf_unfiltered (gdb_stdlog, "enable_break: solib event breakpoint " "placed at entry point: %s\n", - hex_string_custom (symfile_objfile->ei.entry_point, - 8)); + hex_string_custom (entry_point, 8)); return 1; } @@ -782,7 +783,7 @@ frv_relocate_main_executable (void) int changed; struct obj_section *osect; - status = frv_fdpic_loadmap_addresses (target_gdbarch, + status = frv_fdpic_loadmap_addresses (target_gdbarch (), &interp_addr, &exec_addr); if (status < 0 || (exec_addr == 0 && interp_addr == 0)) @@ -798,11 +799,11 @@ frv_relocate_main_executable (void) if (main_executable_lm_info) xfree (main_executable_lm_info); - main_executable_lm_info = xcalloc (1, sizeof (struct lm_info)); + main_executable_lm_info = XCNEW (struct lm_info); main_executable_lm_info->map = ldm; - new_offsets = xcalloc (symfile_objfile->num_sections, - sizeof (struct section_offsets)); + new_offsets = XCNEWVEC (struct section_offsets, + symfile_objfile->num_sections); old_chain = make_cleanup (xfree, new_offsets); changed = 0; @@ -812,7 +813,7 @@ frv_relocate_main_executable (void) int osect_idx; int seg; - osect_idx = osect->the_bfd_section->index; + osect_idx = osect - symfile_objfile->sections; /* Current address of section. */ addr = obj_section_addr (osect); @@ -920,14 +921,14 @@ frv_relocate_section_addresses (struct so_list *so, static CORE_ADDR main_got (void) { - struct minimal_symbol *got_sym; + struct bound_minimal_symbol got_sym; got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, symfile_objfile); - if (got_sym == 0) + if (got_sym.minsym == 0) return 0; - return SYMBOL_VALUE_ADDRESS (got_sym); + return BMSYMBOL_VALUE_ADDRESS (got_sym); } /* Find the global pointer for the given function address ADDR. */ @@ -962,7 +963,7 @@ frv_fdpic_find_global_pointer (CORE_ADDR addr) /* Forward declarations for frv_fdpic_find_canonical_descriptor(). */ static CORE_ADDR find_canonical_descriptor_in_load_object - (CORE_ADDR, CORE_ADDR, char *, bfd *, struct lm_info *); + (CORE_ADDR, CORE_ADDR, const char *, bfd *, struct lm_info *); /* Given a function entry point, attempt to find the canonical descriptor associated with that entry point. Return 0 if no canonical descriptor @@ -971,13 +972,11 @@ static CORE_ADDR find_canonical_descriptor_in_load_object CORE_ADDR frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) { - char *name; + const char *name; CORE_ADDR addr; CORE_ADDR got_value; struct int_elf32_fdpic_loadmap *ldm = 0; struct symbol *sym; - int status; - CORE_ADDR exec_loadmap_addr; /* Fetch the corresponding global pointer for the entry point. */ got_value = frv_fdpic_find_global_pointer (entry_point); @@ -1020,10 +1019,10 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) static CORE_ADDR find_canonical_descriptor_in_load_object - (CORE_ADDR entry_point, CORE_ADDR got_value, char *name, bfd *abfd, + (CORE_ADDR entry_point, CORE_ADDR got_value, const char *name, bfd *abfd, struct lm_info *lm) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); arelent *rel; unsigned int i; CORE_ADDR addr = 0; @@ -1186,12 +1185,12 @@ _initialize_frv_solib (void) frv_so_ops.bfd_open = solib_bfd_open; /* Debug this file's internals. */ - add_setshow_zinteger_cmd ("solib-frv", class_maintenance, - &solib_frv_debug, _("\ + add_setshow_zuinteger_cmd ("solib-frv", class_maintenance, + &solib_frv_debug, _("\ Set internal debugging of shared library code for FR-V."), _("\ Show internal debugging of shared library code for FR-V."), _("\ When non-zero, FR-V solib specific internal debugging is enabled."), - NULL, - NULL, /* FIXME: i18n: */ - &setdebuglist, &showdebuglist); + NULL, + NULL, /* FIXME: i18n: */ + &setdebuglist, &showdebuglist); }