X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Felfread.c;h=2ca10f8fdd7e9aedd432a2fcb2027b622ac16c77;hb=192b62ce0b4bb5c61188f570e127a26d2c32f716;hp=56fac2831e7f47ae2abdb367b7edf018ef5c06ab;hpb=8dddcb8f005e8470312bf33041bb6ddaa5084e32;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/elfread.c b/gdb/elfread.c index 56fac2831e..2ca10f8fdd 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1,6 +1,6 @@ /* Read ELF (Executable and Linking Format) object files for GDB. - Copyright (C) 1991-2016 Free Software Foundation, Inc. + Copyright (C) 1991-2017 Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support. @@ -192,7 +192,7 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip) static struct minimal_symbol * record_minimal_symbol (minimal_symbol_reader &reader, - const char *name, int name_len, int copy_name, + const char *name, int name_len, bool copy_name, CORE_ADDR address, enum minimal_symbol_type ms_type, asection *bfd_section, struct objfile *objfile) @@ -229,7 +229,7 @@ static void elf_symtab_read (minimal_symbol_reader &reader, struct objfile *objfile, int type, long number_of_symbols, asymbol **symbol_table, - int copy_names) + bool copy_names) { struct gdbarch *gdbarch = get_objfile_arch (objfile); asymbol *sym; @@ -488,7 +488,7 @@ elf_symtab_read (minimal_symbol_reader &reader, { int len = atsign - sym->name; - record_minimal_symbol (reader, sym->name, len, 1, symaddr, + record_minimal_symbol (reader, sym->name, len, true, symaddr, ms_type, sym->section, objfile); } } @@ -505,8 +505,8 @@ elf_symtab_read (minimal_symbol_reader &reader, { struct minimal_symbol *mtramp; - mtramp = record_minimal_symbol (reader, sym->name, len - 4, 1, - symaddr, + mtramp = record_minimal_symbol (reader, sym->name, len - 4, + true, symaddr, mst_solib_trampoline, sym->section, objfile); if (mtramp) @@ -612,7 +612,7 @@ elf_rel_plt_read (minimal_symbol_reader &reader, msym = record_minimal_symbol (reader, string_buffer, name_len + got_suffix_len, - 1, address, mst_slot_got_plt, got_plt, + true, address, mst_slot_got_plt, got_plt, objfile); if (msym) SET_MSYMBOL_SIZE (msym, ptr_size); @@ -879,6 +879,7 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) name_at_pc = NULL; function = allocate_value (func_func_type); + VALUE_LVAL (function) = lval_memory; set_value_address (function, pc); /* STT_GNU_IFUNC resolver functions usually receive the HWCAP vector as @@ -992,6 +993,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) gdb_assert (b->loc->next == NULL); func_func = allocate_value (func_func_type); + VALUE_LVAL (func_func) = lval_memory; set_value_address (func_func, b->loc->related_address); value = allocate_value (value_type); @@ -1024,7 +1026,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, const struct elfinfo *ei) { bfd *synth_abfd, *abfd = objfile->obfd; - struct cleanup *back_to; long symcount = 0, dynsymcount = 0, synthcount, storage_needed; asymbol **symbol_table = NULL, **dyn_symbol_table = NULL; asymbol *synthsyms; @@ -1053,7 +1054,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, } minimal_symbol_reader reader (objfile); - back_to = make_cleanup (null_cleanup, NULL); /* Allocate struct to keep track of the symfile. */ dbx = XCNEW (struct dbx_symfile_info); @@ -1080,7 +1080,8 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, bfd_get_filename (objfile->obfd), bfd_errmsg (bfd_get_error ())); - elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table, 0); + elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table, + false); } /* Add the dynamic symbols. */ @@ -1106,7 +1107,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, bfd_errmsg (bfd_get_error ())); elf_symtab_read (reader, objfile, ST_DYNAMIC, dynsymcount, - dyn_symbol_table, 0); + dyn_symbol_table, false); elf_rel_plt_read (reader, objfile, dyn_symbol_table); } @@ -1135,16 +1136,14 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, &synthsyms); if (synthcount > 0) { - asymbol **synth_symbol_table; long i; - make_cleanup (xfree, synthsyms); - synth_symbol_table = XNEWVEC (asymbol *, synthcount); + std::unique_ptr + synth_symbol_table (new asymbol *[synthcount]); for (i = 0; i < synthcount; i++) synth_symbol_table[i] = synthsyms + i; - make_cleanup (xfree, synth_symbol_table); elf_symtab_read (reader, objfile, ST_SYNTHETIC, synthcount, - synth_symbol_table, 1); + synth_symbol_table.get (), true); } /* Install any minimal symbols that have been collected as the current @@ -1154,7 +1153,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, which will do this. */ reader.install (); - do_cleanups (back_to); if (symtab_create_debug) fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n"); @@ -1185,7 +1183,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, capability even for files compiled without -g. */ static void -elf_symfile_read (struct objfile *objfile, int symfile_flags) +elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) { bfd *abfd = objfile->obfd; struct elfinfo ei; @@ -1267,21 +1265,18 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) && objfile->separate_debug_objfile == NULL && objfile->separate_debug_objfile_backlink == NULL) { - char *debugfile; - - debugfile = find_separate_debug_file_by_buildid (objfile); + gdb::unique_xmalloc_ptr debugfile + (find_separate_debug_file_by_buildid (objfile)); if (debugfile == NULL) - debugfile = find_separate_debug_file_by_debuglink (objfile); + debugfile.reset (find_separate_debug_file_by_debuglink (objfile)); - if (debugfile) + if (debugfile != NULL) { - struct cleanup *cleanup = make_cleanup (xfree, debugfile); - bfd *abfd = symfile_bfd_open (debugfile); + gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile.get ())); - make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); - do_cleanups (cleanup); + symbol_file_add_separate (abfd.get (), debugfile.get (), + symfile_flags, objfile); } } }