X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fsolib-frv.c;h=a6d6fe070882e247dfd2ff3f039104ddbd57a135;hb=c76d61da4a65eaadca861bf6c77d579a5cc3f422;hp=acd46da0881d4f25d2ac208ffab8e598e52ef716;hpb=efd66ac6698323d9523a4dce352008c4c835812e;p=binutils-gdb.git diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index acd46da0881..a6d6fe07088 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -1,5 +1,5 @@ /* Handle FR-V (FDPIC) shared libraries for GDB, the GNU Debugger. - Copyright (C) 2004-2014 Free Software Foundation, Inc. + Copyright (C) 2004-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -18,7 +18,6 @@ #include "defs.h" -#include #include "inferior.h" #include "gdbcore.h" #include "solib.h" @@ -30,7 +29,6 @@ #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. */ @@ -107,7 +105,7 @@ fetch_loadmap (CORE_ADDR ldmaddr) /* Fetch initial portion of the loadmap. */ if (target_read_memory (ldmaddr, (gdb_byte *) &ext_ldmbuf_partial, - sizeof ext_ldmbuf_partial)) + sizeof ext_ldmbuf_partial)) { /* Problem reading the target's memory. */ return NULL; @@ -115,7 +113,7 @@ fetch_loadmap (CORE_ADDR ldmaddr) /* Extract the version. */ version = extract_unsigned_integer (ext_ldmbuf_partial.version, - sizeof ext_ldmbuf_partial.version, + sizeof ext_ldmbuf_partial.version, byte_order); if (version != 0) { @@ -125,7 +123,7 @@ fetch_loadmap (CORE_ADDR ldmaddr) /* Extract the number of segments. */ nsegs = extract_unsigned_integer (ext_ldmbuf_partial.nsegs, - sizeof ext_ldmbuf_partial.nsegs, + sizeof ext_ldmbuf_partial.nsegs, byte_order); if (nsegs <= 0) @@ -133,16 +131,16 @@ 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); + + (nsegs - 1) * sizeof (struct ext_elf32_fdpic_loadseg); + 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); /* Read the rest of the loadmap from the target. */ if (target_read_memory (ldmaddr + sizeof ext_ldmbuf_partial, - (gdb_byte *) ext_ldmbuf + sizeof ext_ldmbuf_partial, - ext_ldmbuf_size - sizeof ext_ldmbuf_partial)) + (gdb_byte *) ext_ldmbuf + sizeof ext_ldmbuf_partial, + ext_ldmbuf_size - sizeof ext_ldmbuf_partial)) { /* Couldn't read rest of the loadmap. */ xfree (ext_ldmbuf); @@ -152,8 +150,8 @@ fetch_loadmap (CORE_ADDR ldmaddr) /* Allocate space into which to put information extract from the 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); + + (nsegs - 1) * sizeof (struct int_elf32_fdpic_loadseg); + int_ldmbuf = (struct int_elf32_fdpic_loadmap *) xmalloc (int_ldmbuf_size); /* Place extracted information in internal structs. */ int_ldmbuf->version = version; @@ -162,15 +160,15 @@ fetch_loadmap (CORE_ADDR ldmaddr) { int_ldmbuf->segs[seg].addr = extract_unsigned_integer (ext_ldmbuf->segs[seg].addr, - sizeof (ext_ldmbuf->segs[seg].addr), + sizeof (ext_ldmbuf->segs[seg].addr), byte_order); int_ldmbuf->segs[seg].p_vaddr = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_vaddr, - sizeof (ext_ldmbuf->segs[seg].p_vaddr), + sizeof (ext_ldmbuf->segs[seg].p_vaddr), byte_order); int_ldmbuf->segs[seg].p_memsz = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_memsz, - sizeof (ext_ldmbuf->segs[seg].p_memsz), + sizeof (ext_ldmbuf->segs[seg].p_memsz), byte_order); } @@ -204,36 +202,42 @@ struct ext_link_map /* Link map info to include in an allocated so_list entry. */ -struct lm_info +struct lm_info_frv : public lm_info_base +{ + ~lm_info_frv () { - /* The loadmap, digested into an easier to use form. */ - struct int_elf32_fdpic_loadmap *map; - /* The GOT address for this link map entry. */ - CORE_ADDR got_value; - /* The link map address, needed for frv_fetch_objfile_link_map(). */ - CORE_ADDR lm_addr; - - /* Cached dynamic symbol table and dynamic relocs initialized and - used only by find_canonical_descriptor_in_load_object(). - - Note: kevinb/2004-02-26: It appears that calls to - bfd_canonicalize_dynamic_reloc() will use the same symbols as - those supplied to the first call to this function. Therefore, - it's important to NOT free the asymbol ** data structure - supplied to the first call. Thus the caching of the dynamic - symbols (dyn_syms) is critical for correct operation. The - caching of the dynamic relocations could be dispensed with. */ - asymbol **dyn_syms; - arelent **dyn_relocs; - int dyn_reloc_count; /* Number of dynamic relocs. */ - - }; + xfree (this->map); + xfree (this->dyn_syms); + xfree (this->dyn_relocs); + } + + /* The loadmap, digested into an easier to use form. */ + int_elf32_fdpic_loadmap *map = NULL; + /* The GOT address for this link map entry. */ + CORE_ADDR got_value = 0; + /* The link map address, needed for frv_fetch_objfile_link_map(). */ + CORE_ADDR lm_addr = 0; + + /* Cached dynamic symbol table and dynamic relocs initialized and + used only by find_canonical_descriptor_in_load_object(). + + Note: kevinb/2004-02-26: It appears that calls to + bfd_canonicalize_dynamic_reloc() will use the same symbols as + those supplied to the first call to this function. Therefore, + it's important to NOT free the asymbol ** data structure + supplied to the first call. Thus the caching of the dynamic + symbols (dyn_syms) is critical for correct operation. The + caching of the dynamic relocations could be dispensed with. */ + asymbol **dyn_syms = NULL; + arelent **dyn_relocs = NULL; + int dyn_reloc_count = 0; /* Number of dynamic relocs. */ +}; /* The load map, got value, etc. are not available from the chain of loaded shared objects. ``main_executable_lm_info'' provides a way to get at this information so that it doesn't need to be frequently recomputed. Initialized by frv_relocate_main_executable(). */ -static struct lm_info *main_executable_lm_info; +static lm_info_frv *main_executable_lm_info; static void frv_relocate_main_executable (void); static CORE_ADDR main_got (void); @@ -242,7 +246,7 @@ static int enable_break2 (void); /* Implement the "open_symbol_file_object" target_so_ops method. */ static int -open_symbol_file_object (void *from_ttyp) +open_symbol_file_object (int from_tty) { /* Unimplemented. */ return 0; @@ -266,7 +270,7 @@ static CORE_ADDR lm_base (void) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); - struct minimal_symbol *got_sym; + struct bound_minimal_symbol got_sym; CORE_ADDR addr; gdb_byte buf[FRV_PTR_SIZE]; @@ -283,30 +287,30 @@ lm_base (void) return lm_base_cache; got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, - symfile_objfile); - if (got_sym == 0) + current_program_space->symfile_object_file); + if (got_sym.minsym == 0) { if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "lm_base: _GLOBAL_OFFSET_TABLE_ not found.\n"); + gdb_printf (gdb_stdlog, + "lm_base: _GLOBAL_OFFSET_TABLE_ not found.\n"); return 0; } - addr = MSYMBOL_VALUE_ADDRESS (got_sym) + 8; + addr = got_sym.value_address () + 8; if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "lm_base: _GLOBAL_OFFSET_TABLE_ + 8 = %s\n", - hex_string_custom (addr, 8)); + gdb_printf (gdb_stdlog, + "lm_base: _GLOBAL_OFFSET_TABLE_ + 8 = %s\n", + hex_string_custom (addr, 8)); if (target_read_memory (addr, buf, sizeof buf) != 0) return 0; lm_base_cache = extract_unsigned_integer (buf, sizeof buf, byte_order); if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "lm_base: lm_base_cache = %s\n", - hex_string_custom (lm_base_cache, 8)); + gdb_printf (gdb_stdlog, + "lm_base: lm_base_cache = %s\n", + hex_string_custom (lm_base_cache, 8)); return lm_base_cache; } @@ -351,9 +355,9 @@ frv_current_sos (void) CORE_ADDR got_addr; if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "current_sos: reading link_map entry at %s\n", - hex_string_custom (lm_addr, 8)); + gdb_printf (gdb_stdlog, + "current_sos: reading link_map entry at %s\n", + hex_string_custom (lm_addr, 8)); if (target_read_memory (lm_addr, (gdb_byte *) &lm_buf, sizeof (lm_buf)) != 0) @@ -372,8 +376,6 @@ frv_current_sos (void) this in the list of shared objects. */ if (got_addr != mgot) { - int errcode; - char *name_buf; struct int_elf32_fdpic_loadmap *loadmap; struct so_list *sop; CORE_ADDR addr; @@ -390,30 +392,30 @@ frv_current_sos (void) break; } - sop = xcalloc (1, sizeof (struct so_list)); - sop->lm_info = xcalloc (1, sizeof (struct lm_info)); - sop->lm_info->map = loadmap; - sop->lm_info->got_value = got_addr; - sop->lm_info->lm_addr = lm_addr; + sop = XCNEW (struct so_list); + lm_info_frv *li = new lm_info_frv; + sop->lm_info = li; + li->map = loadmap; + li->got_value = got_addr; + li->lm_addr = lm_addr; /* Fetch the name. */ addr = extract_unsigned_integer (lm_buf.l_name, sizeof (lm_buf.l_name), byte_order); - target_read_string (addr, &name_buf, SO_NAME_MAX_PATH_SIZE - 1, - &errcode); + gdb::unique_xmalloc_ptr name_buf + = target_read_string (addr, SO_NAME_MAX_PATH_SIZE - 1); if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, "current_sos: name = %s\n", - name_buf); + gdb_printf (gdb_stdlog, "current_sos: name = %s\n", + name_buf.get ()); - if (errcode != 0) - warning (_("Can't read pathname for link map entry: %s."), - safe_strerror (errcode)); + if (name_buf == nullptr) + warning (_("Can't read pathname for link map entry.")); else { - strncpy (sop->so_name, name_buf, SO_NAME_MAX_PATH_SIZE - 1); + strncpy (sop->so_name, name_buf.get (), + SO_NAME_MAX_PATH_SIZE - 1); sop->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; - xfree (name_buf); strcpy (sop->so_original_name, sop->so_name); } @@ -456,14 +458,14 @@ frv_in_dynsym_resolve_code (CORE_ADDR pc) static CORE_ADDR displacement_from_map (struct int_elf32_fdpic_loadmap *map, - CORE_ADDR addr) + CORE_ADDR addr) { int seg; for (seg = 0; seg < map->nsegs; seg++) { if (map->segs[seg].p_vaddr <= addr - && addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz) + && addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz) { return map->segs[seg].addr - map->segs[seg].p_vaddr; } @@ -479,14 +481,14 @@ static void enable_break_failure_warning (void) { warning (_("Unable to find dynamic linker breakpoint function.\n" - "GDB will be unable to debug shared library initializers\n" + "GDB will be unable to debug shared library initializers\n" "and track explicitly loaded dynamic code.")); } /* 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); } @@ -519,8 +521,6 @@ static int enable_break2 (void) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); - int success = 0; - char **bkpt_namep; asection *interp_sect; if (enable_break2_done) @@ -531,38 +531,42 @@ enable_break2 (void) /* Find the .interp section; if not found, warn the user and drop into the old breakpoint at symbol code. */ - interp_sect = bfd_get_section_by_name (exec_bfd, ".interp"); + interp_sect = bfd_get_section_by_name (current_program_space->exec_bfd (), + ".interp"); if (interp_sect) { unsigned int interp_sect_size; 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); - bfd_get_section_contents (exec_bfd, interp_sect, - buf, 0, interp_sect_size); + the contents specify the dynamic linker this program uses. */ + interp_sect_size = bfd_section_size (interp_sect); + buf = (char *) alloca (interp_sect_size); + bfd_get_section_contents (current_program_space->exec_bfd (), + interp_sect, buf, 0, interp_sect_size); /* Now we need to figure out where the dynamic linker was - loaded so that we can load its symbols and place a breakpoint - in the dynamic linker itself. - - This address is stored on the stack. However, I've been unable - to find any magic formula to find it for Solaris (appears to - 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) - { - tmp_bfd = solib_bfd_open (buf); - } + loaded so that we can load its symbols and place a breakpoint + in the dynamic linker itself. + + This address is stored on the stack. However, I've been unable + to find any magic formula to find it for Solaris (appears to + be trivial on GNU/Linux). Therefore, we have to try an alternate + mechanism to find the dynamic linker's base address. */ + + gdb_bfd_ref_ptr tmp_bfd; + try + { + tmp_bfd = solib_bfd_open (buf); + } + catch (const gdb_exception &ex) + { + } + if (tmp_bfd == NULL) { enable_break_failure_warning (); @@ -570,112 +574,106 @@ enable_break2 (void) } status = frv_fdpic_loadmap_addresses (target_gdbarch (), - &interp_loadmap_addr, 0); + &interp_loadmap_addr, 0); if (status < 0) { warning (_("Unable to determine dynamic linker loadmap address.")); enable_break_failure_warning (); - gdb_bfd_unref (tmp_bfd); return 0; } if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: interp_loadmap_addr = %s\n", - hex_string_custom (interp_loadmap_addr, 8)); + gdb_printf (gdb_stdlog, + "enable_break: interp_loadmap_addr = %s\n", + hex_string_custom (interp_loadmap_addr, 8)); ldm = fetch_loadmap (interp_loadmap_addr); if (ldm == NULL) { warning (_("Unable to load dynamic linker loadmap at address %s."), - hex_string_custom (interp_loadmap_addr, 8)); + hex_string_custom (interp_loadmap_addr, 8)); enable_break_failure_warning (); - gdb_bfd_unref (tmp_bfd); return 0; } /* Record the relocated start and end address of the dynamic linker - text and plt section for svr4_in_dynsym_resolve_code. */ - interp_sect = bfd_get_section_by_name (tmp_bfd, ".text"); + text and plt section for svr4_in_dynsym_resolve_code. */ + interp_sect = bfd_get_section_by_name (tmp_bfd.get (), ".text"); if (interp_sect) { - interp_text_sect_low - = bfd_section_vma (tmp_bfd, interp_sect); + interp_text_sect_low = bfd_section_vma (interp_sect); interp_text_sect_low += displacement_from_map (ldm, interp_text_sect_low); interp_text_sect_high - = interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect); + = interp_text_sect_low + bfd_section_size (interp_sect); } - interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt"); + interp_sect = bfd_get_section_by_name (tmp_bfd.get (), ".plt"); if (interp_sect) { - interp_plt_sect_low = - bfd_section_vma (tmp_bfd, interp_sect); + interp_plt_sect_low = bfd_section_vma (interp_sect); interp_plt_sect_low += displacement_from_map (ldm, interp_plt_sect_low); interp_plt_sect_high = - interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect); + interp_plt_sect_low + bfd_section_size (interp_sect); } - addr = gdb_bfd_lookup_symbol (tmp_bfd, cmp_name, "_dl_debug_addr"); + addr = gdb_bfd_lookup_symbol (tmp_bfd.get (), cmp_name, "_dl_debug_addr"); if (addr == 0) { warning (_("Could not find symbol _dl_debug_addr " "in dynamic linker")); enable_break_failure_warning (); - gdb_bfd_unref (tmp_bfd); return 0; } if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: _dl_debug_addr " - "(prior to relocation) = %s\n", - hex_string_custom (addr, 8)); + gdb_printf (gdb_stdlog, + "enable_break: _dl_debug_addr " + "(prior to relocation) = %s\n", + hex_string_custom (addr, 8)); addr += displacement_from_map (ldm, addr); if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: _dl_debug_addr " - "(after relocation) = %s\n", - hex_string_custom (addr, 8)); + gdb_printf (gdb_stdlog, + "enable_break: _dl_debug_addr " + "(after relocation) = %s\n", + hex_string_custom (addr, 8)); /* Fetch the address of the r_debug struct. */ if (target_read_memory (addr, addr_buf, sizeof addr_buf) != 0) { warning (_("Unable to fetch contents of _dl_debug_addr " "(at address %s) from dynamic linker"), - hex_string_custom (addr, 8)); + hex_string_custom (addr, 8)); } addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order); if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: _dl_debug_addr[0..3] = %s\n", - hex_string_custom (addr, 8)); + gdb_printf (gdb_stdlog, + "enable_break: _dl_debug_addr[0..3] = %s\n", + hex_string_custom (addr, 8)); /* If it's zero, then the ldso hasn't initialized yet, and so - there are no shared libs yet loaded. */ + there are no shared libs yet loaded. */ if (addr == 0) { if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: ldso not yet initialized\n"); + gdb_printf (gdb_stdlog, + "enable_break: ldso not yet initialized\n"); /* Do not warn, but mark to run again. */ return 0; } /* Fetch the r_brk field. It's 8 bytes from the start of - _dl_debug_addr. */ + _dl_debug_addr. */ if (target_read_memory (addr + 8, addr_buf, sizeof addr_buf) != 0) { warning (_("Unable to fetch _dl_debug_addr->r_brk " "(at address %s) from dynamic linker"), - hex_string_custom (addr + 8, 8)); + hex_string_custom (addr + 8, 8)); enable_break_failure_warning (); - gdb_bfd_unref (tmp_bfd); return 0; } addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order); @@ -685,21 +683,17 @@ enable_break2 (void) { warning (_("Unable to fetch _dl_debug_addr->.r_brk entry point " "(at address %s) from dynamic linker"), - hex_string_custom (addr, 8)); + hex_string_custom (addr, 8)); enable_break_failure_warning (); - 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. */ - gdb_bfd_unref (tmp_bfd); - - /* We're also done with the loadmap. */ + /* We're done with the loadmap. */ xfree (ldm); /* Remove all the solib event breakpoints. Their addresses - may have changed since the last time we ran the program. */ + may have changed since the last time we ran the program. */ remove_solib_event_breakpoints (); /* Now (finally!) create the solib breakpoint. */ @@ -723,66 +717,57 @@ enable_break (void) asection *interp_sect; CORE_ADDR entry_point; - if (symfile_objfile == NULL) + if (current_program_space->symfile_object_file == NULL) { if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: No symbol file found.\n"); + gdb_printf (gdb_stdlog, + "enable_break: No symbol file found.\n"); return 0; } if (!entry_point_address_query (&entry_point)) { if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: Symbol file has no entry point.\n"); + gdb_printf (gdb_stdlog, + "enable_break: Symbol file has no entry point.\n"); return 0; } /* Check for the presence of a .interp section. If there is no such section, the executable is statically linked. */ - interp_sect = bfd_get_section_by_name (exec_bfd, ".interp"); + interp_sect = bfd_get_section_by_name (current_program_space->exec_bfd (), + ".interp"); if (interp_sect == NULL) { if (solib_frv_debug) - fprintf_unfiltered (gdb_stdlog, - "enable_break: No .interp section found.\n"); + gdb_printf (gdb_stdlog, + "enable_break: No .interp section found.\n"); return 0; } 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 (entry_point, 8)); + gdb_printf (gdb_stdlog, + "enable_break: solib event breakpoint " + "placed at entry point: %s\n", + hex_string_custom (entry_point, 8)); return 1; } -/* Implement the "special_symbol_handling" target_so_ops method. */ - -static void -frv_special_symbol_handling (void) -{ - /* Nothing needed for FRV. */ -} - static void frv_relocate_main_executable (void) { int status; CORE_ADDR exec_addr, interp_addr; struct int_elf32_fdpic_loadmap *ldm; - struct cleanup *old_chain; - struct section_offsets *new_offsets; int changed; struct obj_section *osect; status = frv_fdpic_loadmap_addresses (target_gdbarch (), - &interp_addr, &exec_addr); + &interp_addr, &exec_addr); if (status < 0 || (exec_addr == 0 && interp_addr == 0)) { @@ -795,28 +780,26 @@ frv_relocate_main_executable (void) if (ldm == NULL) error (_("Unable to load the executable's loadmap.")); - if (main_executable_lm_info) - xfree (main_executable_lm_info); - main_executable_lm_info = xcalloc (1, sizeof (struct lm_info)); + delete main_executable_lm_info; + main_executable_lm_info = new lm_info_frv; main_executable_lm_info->map = ldm; - new_offsets = xcalloc (symfile_objfile->num_sections, - sizeof (struct section_offsets)); - old_chain = make_cleanup (xfree, new_offsets); + objfile *objf = current_program_space->symfile_object_file; + section_offsets new_offsets (objf->section_offsets.size ()); changed = 0; - ALL_OBJFILE_OSECTIONS (symfile_objfile, osect) + ALL_OBJFILE_OSECTIONS (objf, osect) { CORE_ADDR orig_addr, addr, offset; int osect_idx; int seg; - osect_idx = osect - symfile_objfile->sections; + osect_idx = osect - objf->sections; /* Current address of section. */ - addr = obj_section_addr (osect); + addr = osect->addr (); /* Offset from where this section started. */ - offset = ANOFFSET (symfile_objfile->section_offsets, osect_idx); + offset = objf->section_offsets[osect_idx]; /* Original address prior to any past relocations. */ orig_addr = addr - offset; @@ -825,10 +808,10 @@ frv_relocate_main_executable (void) if (ldm->segs[seg].p_vaddr <= orig_addr && orig_addr < ldm->segs[seg].p_vaddr + ldm->segs[seg].p_memsz) { - new_offsets->offsets[osect_idx] + new_offsets[osect_idx] = ldm->segs[seg].addr - ldm->segs[seg].p_vaddr; - if (new_offsets->offsets[osect_idx] != offset) + if (new_offsets[osect_idx] != offset) changed = 1; break; } @@ -836,12 +819,10 @@ frv_relocate_main_executable (void) } if (changed) - objfile_relocate (symfile_objfile, new_offsets); + objfile_relocate (objf, new_offsets); - do_cleanups (old_chain); - - /* Now that symfile_objfile has been relocated, we can compute the - GOT value and stash it away. */ + /* Now that OBJF has been relocated, we can compute the GOT value + and stash it away. */ main_executable_lm_info->got_value = main_got (); } @@ -871,38 +852,31 @@ frv_clear_solib (void) lm_base_cache = 0; enable_break2_done = 0; main_lm_addr = 0; - if (main_executable_lm_info != 0) - { - xfree (main_executable_lm_info->map); - xfree (main_executable_lm_info->dyn_syms); - xfree (main_executable_lm_info->dyn_relocs); - xfree (main_executable_lm_info); - main_executable_lm_info = 0; - } + + delete main_executable_lm_info; + main_executable_lm_info = NULL; } static void frv_free_so (struct so_list *so) { - xfree (so->lm_info->map); - xfree (so->lm_info->dyn_syms); - xfree (so->lm_info->dyn_relocs); - xfree (so->lm_info); + lm_info_frv *li = (lm_info_frv *) so->lm_info; + + delete li; } static void frv_relocate_section_addresses (struct so_list *so, - struct target_section *sec) + struct target_section *sec) { int seg; - struct int_elf32_fdpic_loadmap *map; - - map = so->lm_info->map; + lm_info_frv *li = (lm_info_frv *) so->lm_info; + int_elf32_fdpic_loadmap *map = li->map; for (seg = 0; seg < map->nsegs; seg++) { if (map->segs[seg].p_vaddr <= sec->addr - && sec->addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz) + && sec->addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz) { CORE_ADDR displ = map->segs[seg].addr - map->segs[seg].p_vaddr; @@ -919,14 +893,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) + objfile *objf = current_program_space->symfile_object_file; + got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, objf); + if (got_sym.minsym == 0) return 0; - return MSYMBOL_VALUE_ADDRESS (got_sym); + return got_sym.value_address (); } /* Find the global pointer for the given function address ADDR. */ @@ -934,24 +908,18 @@ main_got (void) CORE_ADDR frv_fdpic_find_global_pointer (CORE_ADDR addr) { - struct so_list *so; - - so = master_so_list (); - while (so) + for (struct so_list *so : current_program_space->solibs ()) { int seg; - struct int_elf32_fdpic_loadmap *map; - - map = so->lm_info->map; + lm_info_frv *li = (lm_info_frv *) so->lm_info; + int_elf32_fdpic_loadmap *map = li->map; for (seg = 0; seg < map->nsegs; seg++) { if (map->segs[seg].addr <= addr && addr < map->segs[seg].addr + map->segs[seg].p_memsz) - return so->lm_info->got_value; + return li->got_value; } - - so = so->next; } /* Didn't find it in any of the shared objects. So assume it's in the @@ -961,7 +929,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, const char *, bfd *, struct lm_info *); + (CORE_ADDR, CORE_ADDR, const char *, bfd *, lm_info_frv *); /* Given a function entry point, attempt to find the canonical descriptor associated with that entry point. Return 0 if no canonical descriptor @@ -973,7 +941,6 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) const char *name; CORE_ADDR addr; CORE_ADDR got_value; - struct int_elf32_fdpic_loadmap *ldm = 0; struct symbol *sym; /* Fetch the corresponding global pointer for the entry point. */ @@ -986,29 +953,27 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) if (sym == 0) name = 0; else - name = SYMBOL_LINKAGE_NAME (sym); + name = sym->linkage_name (); /* Check the main executable. */ + objfile *objf = current_program_space->symfile_object_file; addr = find_canonical_descriptor_in_load_object - (entry_point, got_value, name, symfile_objfile->obfd, + (entry_point, got_value, name, objf->obfd, main_executable_lm_info); /* If descriptor not found via main executable, check each load object in list of shared objects. */ if (addr == 0) { - struct so_list *so; - - so = master_so_list (); - while (so) + for (struct so_list *so : current_program_space->solibs ()) { + lm_info_frv *li = (lm_info_frv *) so->lm_info; + addr = find_canonical_descriptor_in_load_object - (entry_point, got_value, name, so->abfd, so->lm_info); + (entry_point, got_value, name, so->abfd, li); if (addr != 0) break; - - so = so->next; } } @@ -1018,7 +983,7 @@ 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, const char *name, bfd *abfd, - struct lm_info *lm) + lm_info_frv *lm) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); arelent *rel; @@ -1087,7 +1052,7 @@ find_canonical_descriptor_in_load_object rel = lm->dyn_relocs[i]; /* Relocs of interest are those which meet the following - criteria: + criteria: - the names match (assuming the caller could provide a name which matches ``entry_point''). @@ -1103,7 +1068,7 @@ find_canonical_descriptor_in_load_object this address (which is a GOT entry) to obtain a descriptor address. */ if ((name == 0 || strcmp (name, (*rel->sym_ptr_ptr)->name) == 0) - && rel->howto->type == R_FRV_FUNCDESC) + && rel->howto->type == R_FRV_FUNCDESC) { gdb_byte buf [FRV_PTR_SIZE]; @@ -1142,22 +1107,22 @@ find_canonical_descriptor_in_load_object CORE_ADDR frv_fetch_objfile_link_map (struct objfile *objfile) { - struct so_list *so; - /* Cause frv_current_sos() to be run if it hasn't been already. */ if (main_lm_addr == 0) - solib_add (0, 0, 0, 1); + solib_add (0, 0, 1); /* frv_current_sos() will set main_lm_addr for the main executable. */ - if (objfile == symfile_objfile) + if (objfile == current_program_space->symfile_object_file) return main_lm_addr; /* The other link map addresses may be found by examining the list of shared libraries. */ - for (so = master_so_list (); so; so = so->next) + for (struct so_list *so : current_program_space->solibs ()) { + lm_info_frv *li = (lm_info_frv *) so->lm_info; + if (so->objfile == objfile) - return so->lm_info->lm_addr; + return li->lm_addr; } /* Not found! */ @@ -1166,17 +1131,14 @@ frv_fetch_objfile_link_map (struct objfile *objfile) struct target_so_ops frv_so_ops; -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_frv_solib; - +void _initialize_frv_solib (); void -_initialize_frv_solib (void) +_initialize_frv_solib () { frv_so_ops.relocate_section_addresses = frv_relocate_section_addresses; frv_so_ops.free_so = frv_free_so; frv_so_ops.clear_solib = frv_clear_solib; frv_so_ops.solib_create_inferior_hook = frv_solib_create_inferior_hook; - frv_so_ops.special_symbol_handling = frv_special_symbol_handling; frv_so_ops.current_sos = frv_current_sos; frv_so_ops.open_symbol_file_object = open_symbol_file_object; frv_so_ops.in_dynsym_resolve_code = frv_in_dynsym_resolve_code;