/* 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.
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)
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;
{
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);
}
}
{
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)
asection *plt, *relplt, *got_plt;
int plt_elf_idx;
bfd_size_type reloc_count, reloc;
- char *string_buffer = NULL;
- size_t string_buffer_size = 0;
- struct cleanup *back_to;
struct gdbarch *gdbarch = get_objfile_arch (objfile);
struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
size_t ptr_size = TYPE_LENGTH (ptr_type);
if (! bed->s->slurp_reloc_table (obfd, relplt, dyn_symbol_table, TRUE))
return;
- back_to = make_cleanup (free_current_contents, &string_buffer);
+ std::string string_buffer;
reloc_count = relplt->size / elf_section_data (relplt)->this_hdr.sh_entsize;
for (reloc = 0; reloc < reloc_count; reloc++)
const char *name;
struct minimal_symbol *msym;
CORE_ADDR address;
+ const char *got_suffix = SYMBOL_GOT_PLT_SUFFIX;
const size_t got_suffix_len = strlen (SYMBOL_GOT_PLT_SUFFIX);
- size_t name_len;
name = bfd_asymbol_name (*relplt->relocation[reloc].sym_ptr_ptr);
- name_len = strlen (name);
address = relplt->relocation[reloc].address;
/* Does the pointer reside in the .got.plt section? */
OBJFILE the symbol is undefined and the objfile having NAME defined
may not yet have been loaded. */
- if (string_buffer_size < name_len + got_suffix_len + 1)
- {
- string_buffer_size = 2 * (name_len + got_suffix_len);
- string_buffer = (char *) xrealloc (string_buffer, string_buffer_size);
- }
- memcpy (string_buffer, name, name_len);
- memcpy (&string_buffer[name_len], SYMBOL_GOT_PLT_SUFFIX,
- got_suffix_len + 1);
+ string_buffer.assign (name);
+ string_buffer.append (got_suffix, got_suffix + got_suffix_len);
- msym = record_minimal_symbol (reader, string_buffer,
- name_len + got_suffix_len,
- 1, address, mst_slot_got_plt, got_plt,
+ msym = record_minimal_symbol (reader, string_buffer.c_str (),
+ string_buffer.size (),
+ true, address, mst_slot_got_plt, got_plt,
objfile);
if (msym)
SET_MSYMBOL_SIZE (msym, ptr_size);
}
-
- do_cleanups (back_to);
}
/* The data pointer is htab_t for gnu_ifunc_record_cache_unchecked. */
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
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);
resolved_pc = gdbarch_addr_bits_remove (gdbarch, resolved_pc);
gdb_assert (current_program_space == b->pspace || b->pspace == NULL);
- elf_gnu_ifunc_record_cache (event_location_to_string (b->location),
+ elf_gnu_ifunc_record_cache (event_location_to_string (b->location.get ()),
resolved_pc);
sal = find_pc_line (resolved_pc, 0);
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;
}
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);
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. */
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);
}
&synthsyms);
if (synthcount > 0)
{
- asymbol **synth_symbol_table;
long i;
- make_cleanup (xfree, synthsyms);
- synth_symbol_table = XNEWVEC (asymbol *, synthcount);
+ std::unique_ptr<asymbol *[]>
+ 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);
+
+ xfree (synthsyms);
+ synthsyms = NULL;
}
/* Install any minimal symbols that have been collected as the current
which will do this. */
reader.install ();
- do_cleanups (back_to);
if (symtab_create_debug)
fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n");
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;
&& 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<char> 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);
}
}
}