Index: gdb/elfread.c |
diff --git a/gdb/elfread.c b/gdb/elfread.c |
index 1edfb27caa4d909a68b730ac5b0e91465acd9867..4a36927f9df45c636ccc0c1a9b4814a1ac24eb6b 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-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1991-2013 Free Software Foundation, Inc. |
Written by Fred Fish at Cygnus Support. |
@@ -21,7 +21,7 @@ |
#include "defs.h" |
#include "bfd.h" |
-#include "gdb_string.h" |
+#include <string.h> |
#include "elf-bfd.h" |
#include "elf/common.h" |
#include "elf/internal.h" |
@@ -44,6 +44,8 @@ |
#include "gdbthread.h" |
#include "regcache.h" |
#include "bcache.h" |
+#include "gdb_bfd.h" |
+#include "build-id.h" |
extern void _initialize_elfread (void); |
@@ -58,7 +60,6 @@ static const struct sym_fns elf_sym_fns_lazy_psyms; |
struct elfinfo |
{ |
asection *stabsect; /* Section pointer for .stab section */ |
- asection *stabindexsect; /* Section pointer for .stab.index section */ |
asection *mdebugsect; /* Section pointer for .mdebug section */ |
}; |
@@ -184,10 +185,6 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip) |
{ |
ei->stabsect = sectp; |
} |
- else if (strcmp (sectp->name, ".stab.index") == 0) |
- { |
- ei->stabindexsect = sectp; |
- } |
else if (strcmp (sectp->name, ".mdebug") == 0) |
{ |
ei->mdebugsect = sectp; |
@@ -204,11 +201,13 @@ record_minimal_symbol (const char *name, int name_len, int copy_name, |
if (ms_type == mst_text || ms_type == mst_file_text |
|| ms_type == mst_text_gnu_ifunc) |
- address = gdbarch_smash_text_address (gdbarch, address); |
+ address = gdbarch_addr_bits_remove (gdbarch, address); |
return prim_record_minimal_symbol_full (name, name_len, copy_name, address, |
- ms_type, bfd_section->index, |
- bfd_section, objfile); |
+ ms_type, |
+ gdb_bfd_section_index (objfile->obfd, |
+ bfd_section), |
+ objfile); |
} |
/* Read the symbol table of an ELF file. |
@@ -247,7 +246,7 @@ elf_symtab_read (struct objfile *objfile, int type, |
/* Name of filesym. This is either a constant string or is saved on |
the objfile's filename cache. */ |
const char *filesymname = ""; |
- struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info; |
+ struct dbx_symfile_info *dbx = DBX_SYMFILE_INFO (objfile); |
int stripped = (bfd_get_symcount (objfile->obfd) == 0); |
for (i = 0; i < number_of_symbols; i++) |
@@ -270,7 +269,8 @@ elf_symtab_read (struct objfile *objfile, int type, |
continue; |
} |
- offset = ANOFFSET (objfile->section_offsets, sym->section->index); |
+ offset = ANOFFSET (objfile->section_offsets, |
+ gdb_bfd_section_index (objfile->obfd, sym->section)); |
if (type == ST_DYNAMIC |
&& sym->section == bfd_und_section_ptr |
&& (sym->flags & BSF_FUNCTION)) |
@@ -325,7 +325,8 @@ elf_symtab_read (struct objfile *objfile, int type, |
&& bfd_get_section_by_name (abfd, ".plt") != NULL) |
continue; |
- symaddr += ANOFFSET (objfile->section_offsets, sect->index); |
+ symaddr += ANOFFSET (objfile->section_offsets, |
+ gdb_bfd_section_index (objfile->obfd, sect)); |
msym = record_minimal_symbol |
(sym->name, strlen (sym->name), copy_names, |
@@ -352,11 +353,12 @@ elf_symtab_read (struct objfile *objfile, int type, |
} |
filesym = sym; |
filesymname = bcache (filesym->name, strlen (filesym->name) + 1, |
- objfile->filename_cache); |
+ objfile->per_bfd->filename_cache); |
} |
else if (sym->flags & BSF_SECTION_SYM) |
continue; |
- else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) |
+ else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK |
+ | BSF_GNU_UNIQUE)) |
{ |
struct minimal_symbol *msym; |
@@ -412,7 +414,7 @@ elf_symtab_read (struct objfile *objfile, int type, |
} |
else if (sym->section->flags & SEC_CODE) |
{ |
- if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) |
+ if (sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) |
{ |
if (sym->flags & BSF_GNU_INDIRECT_FUNCTION) |
ms_type = mst_text_gnu_ifunc; |
@@ -442,7 +444,7 @@ elf_symtab_read (struct objfile *objfile, int type, |
} |
else if (sym->section->flags & SEC_ALLOC) |
{ |
- if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) |
+ if (sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) |
{ |
if (sym->section->flags & SEC_LOAD) |
{ |
@@ -555,26 +557,34 @@ elf_symtab_read (struct objfile *objfile, int type, |
if (msym) |
{ |
- /* Pass symbol size field in via BFD. FIXME!!! */ |
- elf_symbol_type *elf_sym; |
- |
/* NOTE: uweigand-20071112: A synthetic symbol does not have an |
- ELF-private part. However, in some cases (e.g. synthetic |
- 'dot' symbols on ppc64) the udata.p entry is set to point back |
- to the original ELF symbol it was derived from. Get the size |
- from that symbol. */ |
+ ELF-private part. */ |
if (type != ST_SYNTHETIC) |
- elf_sym = (elf_symbol_type *) sym; |
- else |
- elf_sym = (elf_symbol_type *) sym->udata.p; |
- |
- if (elf_sym) |
- MSYMBOL_SIZE(msym) = elf_sym->internal_elf_sym.st_size; |
+ { |
+ /* Pass symbol size field in via BFD. FIXME!!! */ |
+ elf_symbol_type *elf_sym = (elf_symbol_type *) sym; |
+ SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size); |
+ } |
msym->filename = filesymname; |
gdbarch_elf_make_msymbol_special (gdbarch, sym, msym); |
} |
+ /* If we see a default versioned symbol, install it under |
+ its version-less name. */ |
+ if (msym != NULL) |
+ { |
+ const char *atsign = strchr (sym->name, '@'); |
+ |
+ if (atsign != NULL && atsign[1] == '@' && atsign > sym->name) |
+ { |
+ int len = atsign - sym->name; |
+ |
+ record_minimal_symbol (sym->name, len, 1, symaddr, |
+ ms_type, sym->section, objfile); |
+ } |
+ } |
+ |
/* For @plt symbols, also record a trampoline to the |
destination symbol. The @plt symbol will be used in |
disassembly, and the trampoline will be used when we are |
@@ -593,7 +603,7 @@ elf_symtab_read (struct objfile *objfile, int type, |
sym->section, objfile); |
if (mtramp) |
{ |
- MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym); |
+ SET_MSYMBOL_SIZE (mtramp, MSYMBOL_SIZE (msym)); |
mtramp->created_by_gdb = 1; |
mtramp->filename = filesymname; |
gdbarch_elf_make_msymbol_special (gdbarch, sym, mtramp); |
@@ -622,7 +632,7 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table) |
char *string_buffer = NULL; |
size_t string_buffer_size = 0; |
struct cleanup *back_to; |
- struct gdbarch *gdbarch = objfile->gdbarch; |
+ 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); |
@@ -688,7 +698,7 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table) |
1, address, mst_slot_got_plt, got_plt, |
objfile); |
if (msym) |
- MSYMBOL_SIZE (msym) = ptr_size; |
+ SET_MSYMBOL_SIZE (msym, ptr_size); |
} |
do_cleanups (back_to); |
@@ -740,7 +750,7 @@ elf_gnu_ifunc_cache_eq (const void *a_voidp, const void *b_voidp) |
static int |
elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) |
{ |
- struct minimal_symbol *msym; |
+ struct bound_minimal_symbol msym; |
asection *sect; |
struct objfile *objfile; |
htab_t htab; |
@@ -748,13 +758,13 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) |
void **slot; |
msym = lookup_minimal_symbol_by_pc (addr); |
- if (msym == NULL) |
+ if (msym.minsym == NULL) |
return 0; |
- if (SYMBOL_VALUE_ADDRESS (msym) != addr) |
+ if (SYMBOL_VALUE_ADDRESS (msym.minsym) != addr) |
return 0; |
/* minimal symbols have always SYMBOL_OBJ_SECTION non-NULL. */ |
- sect = SYMBOL_OBJ_SECTION (msym)->the_bfd_section; |
- objfile = SYMBOL_OBJ_SECTION (msym)->objfile; |
+ sect = SYMBOL_OBJ_SECTION (msym.objfile, msym.minsym)->the_bfd_section; |
+ objfile = msym.objfile; |
/* If .plt jumps back to .plt the symbol is still deferred for later |
resolution and it has no use for GDB. Besides ".text" this symbol can |
@@ -783,7 +793,7 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) |
if (*slot != NULL) |
{ |
struct elf_gnu_ifunc_cache *entry_found_p = *slot; |
- struct gdbarch *gdbarch = objfile->gdbarch; |
+ struct gdbarch *gdbarch = get_objfile_arch (objfile); |
if (entry_found_p->addr != addr) |
{ |
@@ -863,7 +873,7 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p) |
ALL_PSPACE_OBJFILES (current_program_space, objfile) |
{ |
bfd *obfd = objfile->obfd; |
- struct gdbarch *gdbarch = objfile->gdbarch; |
+ 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); |
CORE_ADDR pointer_address, addr; |
@@ -1073,146 +1083,6 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) |
update_breakpoint_locations (b, sals, sals_end); |
} |
-struct build_id |
- { |
- size_t size; |
- gdb_byte data[1]; |
- }; |
- |
-/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ |
- |
-static struct build_id * |
-build_id_bfd_get (bfd *abfd) |
-{ |
- struct build_id *retval; |
- |
- if (!bfd_check_format (abfd, bfd_object) |
- || bfd_get_flavour (abfd) != bfd_target_elf_flavour |
- || elf_tdata (abfd)->build_id == NULL) |
- return NULL; |
- |
- retval = xmalloc (sizeof *retval - 1 + elf_tdata (abfd)->build_id_size); |
- retval->size = elf_tdata (abfd)->build_id_size; |
- memcpy (retval->data, elf_tdata (abfd)->build_id, retval->size); |
- |
- return retval; |
-} |
- |
-/* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value. */ |
- |
-static int |
-build_id_verify (const char *filename, struct build_id *check) |
-{ |
- bfd *abfd; |
- struct build_id *found = NULL; |
- int retval = 0; |
- |
- /* We expect to be silent on the non-existing files. */ |
- abfd = bfd_open_maybe_remote (filename); |
- if (abfd == NULL) |
- return 0; |
- |
- found = build_id_bfd_get (abfd); |
- |
- if (found == NULL) |
- warning (_("File \"%s\" has no build-id, file skipped"), filename); |
- else if (found->size != check->size |
- || memcmp (found->data, check->data, found->size) != 0) |
- warning (_("File \"%s\" has a different build-id, file skipped"), |
- filename); |
- else |
- retval = 1; |
- |
- gdb_bfd_close_or_warn (abfd); |
- |
- xfree (found); |
- |
- return retval; |
-} |
- |
-static char * |
-build_id_to_debug_filename (struct build_id *build_id) |
-{ |
- char *link, *debugdir, *retval = NULL; |
- VEC (char_ptr) *debugdir_vec; |
- struct cleanup *back_to; |
- int ix; |
- |
- /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */ |
- link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1 |
- + 2 * build_id->size + (sizeof ".debug" - 1) + 1); |
- |
- /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will |
- cause "/.build-id/..." lookups. */ |
- |
- debugdir_vec = dirnames_to_char_ptr_vec (debug_file_directory); |
- back_to = make_cleanup_free_char_ptr_vec (debugdir_vec); |
- |
- for (ix = 0; VEC_iterate (char_ptr, debugdir_vec, ix, debugdir); ++ix) |
- { |
- size_t debugdir_len = strlen (debugdir); |
- gdb_byte *data = build_id->data; |
- size_t size = build_id->size; |
- char *s; |
- |
- memcpy (link, debugdir, debugdir_len); |
- s = &link[debugdir_len]; |
- s += sprintf (s, "/.build-id/"); |
- if (size > 0) |
- { |
- size--; |
- s += sprintf (s, "%02x", (unsigned) *data++); |
- } |
- if (size > 0) |
- *s++ = '/'; |
- while (size-- > 0) |
- s += sprintf (s, "%02x", (unsigned) *data++); |
- strcpy (s, ".debug"); |
- |
- /* lrealpath() is expensive even for the usually non-existent files. */ |
- if (access (link, F_OK) == 0) |
- retval = lrealpath (link); |
- |
- if (retval != NULL && !build_id_verify (retval, build_id)) |
- { |
- xfree (retval); |
- retval = NULL; |
- } |
- |
- if (retval != NULL) |
- break; |
- } |
- |
- do_cleanups (back_to); |
- return retval; |
-} |
- |
-static char * |
-find_separate_debug_file_by_buildid (struct objfile *objfile) |
-{ |
- struct build_id *build_id; |
- |
- build_id = build_id_bfd_get (objfile->obfd); |
- if (build_id != NULL) |
- { |
- char *build_id_name; |
- |
- build_id_name = build_id_to_debug_filename (build_id); |
- xfree (build_id); |
- /* Prevent looping on a stripped .debug file. */ |
- if (build_id_name != NULL |
- && filename_cmp (build_id_name, objfile->name) == 0) |
- { |
- warning (_("\"%s\": separate debug info file has no debug info"), |
- build_id_name); |
- xfree (build_id_name); |
- } |
- else if (build_id_name != NULL) |
- return build_id_name; |
- } |
- return NULL; |
-} |
- |
/* Scan and build partial symbols for a symbol file. |
We have been initialized by a call to elf_symfile_init, which |
currently does nothing. |
@@ -1250,12 +1120,13 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) |
long symcount = 0, dynsymcount = 0, synthcount, storage_needed; |
asymbol **symbol_table = NULL, **dyn_symbol_table = NULL; |
asymbol *synthsyms; |
+ struct dbx_symfile_info *dbx; |
if (symtab_create_debug) |
{ |
fprintf_unfiltered (gdb_stdlog, |
"Reading minimal symbols of objfile %s ...\n", |
- objfile->name); |
+ objfile_name (objfile)); |
} |
init_minimal_symbol_collection (); |
@@ -1264,16 +1135,13 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) |
memset ((char *) &ei, 0, sizeof (ei)); |
/* Allocate struct to keep track of the symfile. */ |
- objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *) |
- xmalloc (sizeof (struct dbx_symfile_info)); |
- memset ((char *) objfile->deprecated_sym_stab_info, |
- 0, sizeof (struct dbx_symfile_info)); |
+ dbx = XCNEW (struct dbx_symfile_info); |
+ set_objfile_data (objfile, dbx_objfile_data_key, dbx); |
make_cleanup (free_elfinfo, (void *) objfile); |
/* Process the normal ELF symbol table first. This may write some |
- chain of info into the dbx_symfile_info in |
- objfile->deprecated_sym_stab_info, which can later be used by |
- elfstab_offset_sections. */ |
+ chain of info into the dbx_symfile_info of the objfile, which can |
+ later be used by elfstab_offset_sections. */ |
storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); |
if (storage_needed < 0) |
@@ -1367,6 +1235,9 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) |
install_minimal_symbols (objfile); |
do_cleanups (back_to); |
+ if (symtab_create_debug) |
+ fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n"); |
+ |
/* Now process debugging information, which is contained in |
special ELF sections. */ |
@@ -1419,21 +1290,31 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) |
if (!objfile_has_partial_symbols (objfile) |
&& dwarf2_initialize_objfile (objfile)) |
- objfile->sf = &elf_sym_fns_gdb_index; |
+ objfile_set_sym_fns (objfile, &elf_sym_fns_gdb_index); |
else |
{ |
/* It is ok to do this even if the stabs reader made some |
partial symbols, because OBJF_PSYMTABS_READ has not been |
set, and so our lazy reader function will still be called |
when needed. */ |
- objfile->sf = &elf_sym_fns_lazy_psyms; |
+ objfile_set_sym_fns (objfile, &elf_sym_fns_lazy_psyms); |
} |
} |
/* If the file has its own symbol tables it has no separate debug |
info. `.dynsym'/`.symtab' go to MSYMBOLS, `.debug_info' goes to |
SYMTABS/PSYMTABS. `.gnu_debuglink' may no longer be present with |
- `.note.gnu.build-id'. */ |
- else if (!objfile_has_partial_symbols (objfile)) |
+ `.note.gnu.build-id'. |
+ |
+ .gnu_debugdata is !objfile_has_partial_symbols because it contains only |
+ .symtab, not .debug_* section. But if we already added .gnu_debugdata as |
+ an objfile via find_separate_debug_file_in_section there was no separate |
+ debug info available. Therefore do not attempt to search for another one, |
+ objfile->separate_debug_objfile->separate_debug_objfile GDB guarantees to |
+ be NULL and we would possibly violate it. */ |
+ |
+ else if (!objfile_has_partial_symbols (objfile) |
+ && objfile->separate_debug_objfile == NULL |
+ && objfile->separate_debug_objfile_backlink == NULL) |
{ |
char *debugfile; |
@@ -1444,15 +1325,14 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) |
if (debugfile) |
{ |
+ struct cleanup *cleanup = make_cleanup (xfree, debugfile); |
bfd *abfd = symfile_bfd_open (debugfile); |
- symbol_file_add_separate (abfd, symfile_flags, objfile); |
- xfree (debugfile); |
+ make_cleanup_bfd_unref (abfd); |
+ symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); |
+ do_cleanups (cleanup); |
} |
} |
- |
- if (symtab_create_debug) |
- fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n"); |
} |
/* Callback to lazily read psymtabs. */ |
@@ -1464,15 +1344,14 @@ read_psyms (struct objfile *objfile) |
dwarf2_build_psymtabs (objfile); |
} |
-/* This cleans up the objfile's deprecated_sym_stab_info pointer, and |
- the chain of stab_section_info's, that might be dangling from |
- it. */ |
+/* This cleans up the objfile's dbx symfile info, and the chain of |
+ stab_section_info's, that might be dangling from it. */ |
static void |
free_elfinfo (void *objp) |
{ |
struct objfile *objfile = (struct objfile *) objp; |
- struct dbx_symfile_info *dbxinfo = objfile->deprecated_sym_stab_info; |
+ struct dbx_symfile_info *dbxinfo = DBX_SYMFILE_INFO (objfile); |
struct stab_section_info *ssi, *nssi; |
ssi = dbxinfo->stab_section_info; |
@@ -1509,11 +1388,6 @@ elf_new_init (struct objfile *ignore) |
static void |
elf_symfile_finish (struct objfile *objfile) |
{ |
- if (objfile->deprecated_sym_stab_info != NULL) |
- { |
- xfree (objfile->deprecated_sym_stab_info); |
- } |
- |
dwarf2_free_objfile (objfile); |
} |
@@ -1547,7 +1421,7 @@ void |
elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst) |
{ |
const char *filename = pst->filename; |
- struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info; |
+ struct dbx_symfile_info *dbx = DBX_SYMFILE_INFO (objfile); |
struct stab_section_info *maybe = dbx->stab_section_info; |
struct stab_section_info *questionable = 0; |
int i; |
@@ -1631,45 +1505,12 @@ elf_get_probes (struct objfile *objfile) |
return probes_per_objfile; |
} |
-/* Implementation of `sym_get_probe_argument_count', as documented in |
- symfile.h. */ |
- |
-static unsigned |
-elf_get_probe_argument_count (struct objfile *objfile, |
- struct probe *probe) |
-{ |
- return probe->pops->get_probe_argument_count (probe, objfile); |
-} |
- |
-/* Implementation of `sym_evaluate_probe_argument', as documented in |
- symfile.h. */ |
- |
-static struct value * |
-elf_evaluate_probe_argument (struct objfile *objfile, |
- struct probe *probe, |
- unsigned n) |
-{ |
- return probe->pops->evaluate_probe_argument (probe, objfile, n); |
-} |
- |
-/* Implementation of `sym_compile_to_ax', as documented in symfile.h. */ |
- |
-static void |
-elf_compile_to_ax (struct objfile *objfile, |
- struct probe *probe, |
- struct agent_expr *expr, |
- struct axs_value *value, |
- unsigned n) |
-{ |
- probe->pops->compile_to_ax (probe, objfile, expr, value, n); |
-} |
- |
/* Implementation of `sym_relocate_probe', as documented in symfile.h. */ |
static void |
elf_symfile_relocate_probe (struct objfile *objfile, |
- struct section_offsets *new_offsets, |
- struct section_offsets *delta) |
+ const struct section_offsets *new_offsets, |
+ const struct section_offsets *delta) |
{ |
int ix; |
VEC (probe_p) *probes = objfile_data (objfile, probe_key); |
@@ -1701,18 +1542,14 @@ probe_key_free (struct objfile *objfile, void *d) |
static const struct sym_probe_fns elf_probe_fns = |
{ |
- elf_get_probes, /* sym_get_probes */ |
- elf_get_probe_argument_count, /* sym_get_probe_argument_count */ |
- elf_evaluate_probe_argument, /* sym_evaluate_probe_argument */ |
- elf_compile_to_ax, /* sym_compile_to_ax */ |
- elf_symfile_relocate_probe, /* sym_relocate_probe */ |
+ elf_get_probes, /* sym_get_probes */ |
+ elf_symfile_relocate_probe, /* sym_relocate_probe */ |
}; |
/* Register that we are able to handle ELF object file formats. */ |
static const struct sym_fns elf_sym_fns = |
{ |
- bfd_target_elf_flavour, |
elf_new_init, /* init anything gbl to entire symtab */ |
elf_symfile_init, /* read initial info, setup for sym_read() */ |
elf_symfile_read, /* read a symbol file into symtab */ |
@@ -1731,7 +1568,6 @@ static const struct sym_fns elf_sym_fns = |
static const struct sym_fns elf_sym_fns_lazy_psyms = |
{ |
- bfd_target_elf_flavour, |
elf_new_init, /* init anything gbl to entire symtab */ |
elf_symfile_init, /* read initial info, setup for sym_read() */ |
elf_symfile_read, /* read a symbol file into symtab */ |
@@ -1749,7 +1585,6 @@ static const struct sym_fns elf_sym_fns_lazy_psyms = |
DWARF-specific GNU index rather than psymtab. */ |
static const struct sym_fns elf_sym_fns_gdb_index = |
{ |
- bfd_target_elf_flavour, |
elf_new_init, /* init anything gbl to entire symab */ |
elf_symfile_init, /* read initial info, setup for sym_red() */ |
elf_symfile_read, /* read a symbol file into symtab */ |
@@ -1777,7 +1612,7 @@ void |
_initialize_elfread (void) |
{ |
probe_key = register_objfile_data_with_cleanup (NULL, probe_key_free); |
- add_symtab_fns (&elf_sym_fns); |
+ add_symtab_fns (bfd_target_elf_flavour, &elf_sym_fns); |
elf_objfile_gnu_ifunc_cache_data = register_objfile_data (); |
gnu_ifunc_fns_p = &elf_gnu_ifunc_fns; |