/* Read ELF (Executable and Linking Format) object files for GDB.
- Copyright 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/************************************************************************
- * *
- * NOTICE *
- * *
- * This file is still under construction. When it is complete, this *
- * notice will be removed. Until then, direct any questions or changes *
- * *
- * FIXME Still needs support for shared libraries. *
- * FIXME Still needs support for core files. *
- * FIXME The ".debug" and ".line" section names are hardwired. *
- * *
- ************************************************************************/
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
-#include "elf/common.h"
-#include "elf/external.h"
-#include "elf/internal.h"
#include "bfd.h"
-#include "libbfd.h" /* For bfd_elf_find_section */
+#include "gdb_string.h"
+#include "elf-bfd.h"
+#include "elf/mips.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
-
-#include <sys/types.h> /* For off_t for gdb-stabs.h */
+#include "stabsread.h"
#include "gdb-stabs.h"
-
-#define STREQ(a,b) (strcmp((a),(b))==0)
+#include "complaints.h"
+#include "demangle.h"
/* The struct elfinfo is available only during ELF symbol table and
psymtab reading. It is destroyed at the complation of psymtab-reading.
It's local to elf_symfile_read. */
struct elfinfo {
- unsigned int dboffset; /* Offset to dwarf debug section */
+ file_ptr dboffset; /* Offset to dwarf debug section */
unsigned int dbsize; /* Size of dwarf debug section */
- unsigned int lnoffset; /* Offset to dwarf line number section */
+ file_ptr lnoffset; /* Offset to dwarf line number section */
unsigned int lnsize; /* Size of dwarf line number section */
asection *stabsect; /* Section pointer for .stab section */
asection *stabindexsect; /* Section pointer for .stab.index section */
+ asection *mdebugsect; /* Section pointer for .mdebug section */
};
/* Various things we might complain about... */
elf_symfile_finish PARAMS ((struct objfile *));
static void
-elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
+elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *, int));
static void
-free_elfinfo PARAMS ((PTR));
+free_elfinfo PARAMS ((void *));
static struct section_offsets *
elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-#if 0
-static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type,
- struct objfile *));
-#endif
-
-static void
+static struct minimal_symbol *
record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
enum minimal_symbol_type, char *,
struct objfile *));
static void
-elf_locate_sections PARAMS ((bfd *, asection *, PTR));
+elf_locate_sections PARAMS ((bfd *, asection *, void *));
/* We are called once per section from elf_symfile_read. We
need to examine each section we are passed, check to see
We also recognize the ".stab" sections used by the Sun compilers
released with Solaris 2.
- FIXME: The section names should not be hardwired strings. */
+ FIXME: The section names should not be hardwired strings (what
+ should they be? I don't think most object file formats have enough
+ section flags to specify what kind of debug section it is
+ -kingdon). */
static void
elf_locate_sections (ignore_abfd, sectp, eip)
{
ei -> stabindexsect = sectp;
}
+ else if (STREQ (sectp -> name, ".mdebug"))
+ {
+ ei -> mdebugsect = sectp;
+ }
}
#if 0 /* Currently unused */
#endif
-/*
-
-LOCAL FUNCTION
-
- record_minimal_symbol -- add entry to minimal symbol table
-
-SYNOPSIS
-
- static void record_minimal_symbol (char *name, CORE_ADDR address)
-
-DESCRIPTION
-
- Given a pointer to the name of a symbol that should be added to the
- minimal symbol table and the address associated with that symbol, records
- this information for later use in building the minimal symbol table.
-
- */
-
-#if 0 /* FIXME: Unused */
-
-static void
-record_minimal_symbol (name, address, ms_type, objfile)
+static struct minimal_symbol *
+record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
char *name;
CORE_ADDR address;
enum minimal_symbol_type ms_type;
+ char *info; /* FIXME, is this really char *? */
struct objfile *objfile;
{
- name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol (name, address, ms_type);
-}
+ int section;
+ /* Guess the section from the type. This is likely to be wrong in
+ some cases. */
+ switch (ms_type)
+ {
+ case mst_text:
+ case mst_file_text:
+ section = SECT_OFF_TEXT;
+#ifdef SMASH_TEXT_ADDRESS
+ SMASH_TEXT_ADDRESS (address);
#endif
+ break;
+ case mst_data:
+ case mst_file_data:
+ section = SECT_OFF_DATA;
+ break;
+ case mst_bss:
+ case mst_file_bss:
+ section = SECT_OFF_BSS;
+ break;
+ default:
+ section = -1;
+ break;
+ }
-static void
-record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
- char *name;
- CORE_ADDR address;
- enum minimal_symbol_type ms_type;
- char *info; /* FIXME, is this really char *? */
- struct objfile *objfile;
-{
name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol_and_info (name, address, ms_type, info);
+ return prim_record_minimal_symbol_and_info
+ (name, address, ms_type, info, section, objfile);
}
/*
SYNOPSIS
void elf_symtab_read (bfd *abfd, CORE_ADDR addr,
- struct objfile *objfile)
+ struct objfile *objfile, int dynamic)
DESCRIPTION
*/
static void
-elf_symtab_read (abfd, addr, objfile)
+elf_symtab_read (abfd, addr, objfile, dynamic)
bfd *abfd;
CORE_ADDR addr;
struct objfile *objfile;
+ int dynamic;
{
- unsigned int storage_needed;
+ long storage_needed;
asymbol *sym;
asymbol **symbol_table;
- unsigned int number_of_symbols;
- unsigned int i;
+ long number_of_symbols;
+ long i;
int index;
struct cleanup *back_to;
CORE_ADDR symaddr;
enum minimal_symbol_type ms_type;
- /* If sectinfo is nonzero, it contains section info that should end up
+ /* If sectinfo is nonNULL, it contains section info that should end up
filed in the objfile. */
- struct stab_section_info *sectinfo = 0;
+ struct stab_section_info *sectinfo = NULL;
/* If filesym is nonzero, it points to a file symbol, but we haven't
seen any section info for it yet. */
asymbol *filesym = 0;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ /* Name of filesym, as saved on the symbol_obstack. */
+ char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack);
+#endif
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
- objfile->sym_private;
-
- storage_needed = get_symtab_upper_bound (abfd);
+ objfile->sym_stab_info;
+ unsigned long size;
+ int stripped = (bfd_get_symcount (abfd) == 0);
+
+ if (dynamic)
+ {
+ storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
+ /* Nothing to be done if there is no dynamic symtab. */
+ if (storage_needed < 0)
+ return;
+ }
+ else
+ {
+ storage_needed = bfd_get_symtab_upper_bound (abfd);
+ if (storage_needed < 0)
+ error ("Can't read symbols from %s: %s", bfd_get_filename (abfd),
+ bfd_errmsg (bfd_get_error ()));
+ }
if (storage_needed > 0)
{
symbol_table = (asymbol **) xmalloc (storage_needed);
back_to = make_cleanup (free, symbol_table);
- number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
-
+ if (dynamic)
+ number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd,
+ symbol_table);
+ else
+ number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
+ if (number_of_symbols < 0)
+ error ("Can't read symbols from %s: %s", bfd_get_filename (abfd),
+ bfd_errmsg (bfd_get_error ()));
for (i = 0; i < number_of_symbols; i++)
{
sym = symbol_table[i];
- /* Select global/weak symbols that are defined in a specific section.
- Note that bfd now puts abs symbols in their own section, so
- all symbols we are interested in will have a section. */
- if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
- && (sym -> section != NULL))
+ if (sym -> name == NULL || *sym -> name == '\0')
+ {
+ /* Skip names that don't exist (shouldn't happen), or names
+ that are null strings (may happen). */
+ continue;
+ }
+
+ if (dynamic
+ && sym -> section == &bfd_und_section
+ && (sym -> flags & BSF_FUNCTION))
{
+ struct minimal_symbol *msym;
+
+ /* Symbol is a reference to a function defined in
+ a shared library.
+ If its value is non zero then it is usually the address
+ of the corresponding entry in the procedure linkage table,
+ relative to the base address.
+ If its value is zero then the dynamic linker has to resolve
+ the symbol. We are unable to find any meaningful address
+ for this symbol in the executable file, so we skip it. */
symaddr = sym -> value;
+ if (symaddr == 0)
+ continue;
+ symaddr += addr;
+ msym = record_minimal_symbol_and_info
+ ((char *) sym -> name, symaddr,
+ mst_solib_trampoline, NULL, objfile);
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ if (msym != NULL)
+ msym->filename = filesymname;
+#endif
+ continue;
+ }
+
+ /* If it is a nonstripped executable, do not enter dynamic
+ symbols, as the dynamic symbol table is usually a subset
+ of the main symbol table. */
+ if (dynamic && !stripped)
+ continue;
+ if (sym -> flags & BSF_FILE)
+ {
+ /* STT_FILE debugging symbol that helps stabs-in-elf debugging.
+ Chain any old one onto the objfile; remember new sym. */
+ if (sectinfo != NULL)
+ {
+ sectinfo -> next = dbx -> stab_section_info;
+ dbx -> stab_section_info = sectinfo;
+ sectinfo = NULL;
+ }
+ filesym = sym;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ filesymname =
+ obsavestring ((char *)filesym->name, strlen (filesym->name),
+ &objfile->symbol_obstack);
+#endif
+ }
+ else if (sym -> flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
+ {
+ struct minimal_symbol *msym;
+
+ /* Select global/local/weak symbols. Note that bfd puts abs
+ symbols in their own section, so all symbols we are
+ interested in will have a section. */
+ /* Bfd symbols are section relative. */
+ symaddr = sym -> value + sym -> section -> vma;
/* Relocate all non-absolute symbols by base address. */
if (sym -> section != &bfd_abs_section)
- symaddr += addr;
-
+ {
+ symaddr += addr;
+ }
/* For non-absolute symbols, use the type of the section
they are relative to, to intuit text/data. Bfd provides
no way of figuring this out for absolute symbols. */
- if (sym -> section -> flags & SEC_CODE)
+ if (sym -> section == &bfd_abs_section)
+ {
+ /* This is a hack to get the minimal symbol type
+ right for Irix 5, which has absolute adresses
+ with special section indices for dynamic symbols. */
+ unsigned short shndx =
+ ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
+
+ switch (shndx)
+ {
+ case SHN_MIPS_TEXT:
+ ms_type = mst_text;
+ break;
+ case SHN_MIPS_DATA:
+ ms_type = mst_data;
+ break;
+ case SHN_MIPS_ACOMMON:
+ ms_type = mst_bss;
+ break;
+ default:
+ ms_type = mst_abs;
+ }
+ }
+ else if (sym -> section -> flags & SEC_CODE)
{
- ms_type = mst_text;
+ if (sym -> flags & BSF_GLOBAL)
+ {
+ ms_type = mst_text;
+ }
+ else if ((sym->name[0] == '.' && sym->name[1] == 'L')
+ || ((sym -> flags & BSF_LOCAL)
+ && sym->name[0] == '$'
+ && sym->name[1] == 'L'))
+ /* Looks like a compiler-generated label. Skip it.
+ The assembler should be skipping these (to keep
+ executables small), but apparently with gcc on the
+ delta m88k SVR4, it loses. So to have us check too
+ should be harmless (but I encourage people to fix this
+ in the assembler instead of adding checks here). */
+ continue;
+ else
+ {
+ ms_type = mst_file_text;
+ }
}
- else if (sym -> section -> flags & SEC_DATA)
+ else if (sym -> section -> flags & SEC_ALLOC)
{
- ms_type = mst_data;
+ if (sym -> flags & BSF_GLOBAL)
+ {
+ if (sym -> section -> flags & SEC_LOAD)
+ {
+ ms_type = mst_data;
+ }
+ else
+ {
+ ms_type = mst_bss;
+ }
+ }
+ else if (sym -> flags & BSF_LOCAL)
+ {
+ /* Named Local variable in a Data section. Check its
+ name for stabs-in-elf. The STREQ macro checks the
+ first character inline, so we only actually do a
+ strcmp function call on names that start with 'B'
+ or 'D' */
+ index = SECT_OFF_MAX;
+ if (STREQ ("Bbss.bss", sym -> name))
+ {
+ index = SECT_OFF_BSS;
+ }
+ else if (STREQ ("Ddata.data", sym -> name))
+ {
+ index = SECT_OFF_DATA;
+ }
+ else if (STREQ ("Drodata.rodata", sym -> name))
+ {
+ index = SECT_OFF_RODATA;
+ }
+ if (index != SECT_OFF_MAX)
+ {
+ /* Found a special local symbol. Allocate a
+ sectinfo, if needed, and fill it in. */
+ if (sectinfo == NULL)
+ {
+ sectinfo = (struct stab_section_info *)
+ xmmalloc (objfile -> md, sizeof (*sectinfo));
+ memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
+ if (filesym == NULL)
+ {
+ complain (§ion_info_complaint,
+ sym -> name);
+ }
+ else
+ {
+ sectinfo -> filename =
+ (char *) filesym -> name;
+ }
+ }
+ if (sectinfo -> sections[index] != 0)
+ {
+ complain (§ion_info_dup_complaint,
+ sectinfo -> filename);
+ }
+ /* Bfd symbols are section relative. */
+ symaddr = sym -> value + sym -> section -> vma;
+ /* Relocate non-absolute symbols by base address. */
+ if (sym -> section != &bfd_abs_section)
+ {
+ symaddr += addr;
+ }
+ sectinfo -> sections[index] = symaddr;
+ /* The special local symbols don't go in the
+ minimal symbol table, so ignore this one. */
+ continue;
+ }
+ /* Not a special stabs-in-elf symbol, do regular
+ symbol processing. */
+ if (sym -> section -> flags & SEC_LOAD)
+ {
+ ms_type = mst_file_data;
+ }
+ else
+ {
+ ms_type = mst_file_bss;
+ }
+ }
+ else
+ {
+ ms_type = mst_unknown;
+ }
}
else
{
/* FIXME: Solaris2 shared libraries include lots of
odd "absolute" and "undefined" symbols, that play
hob with actions like finding what function the PC
- is in. Ignore them if they aren't text or data. */
+ is in. Ignore them if they aren't text, data, or bss. */
/* ms_type = mst_unknown; */
continue; /* Skip this symbol. */
}
/* Pass symbol size field in via BFD. FIXME!!! */
- record_minimal_symbol_and_info ((char *) sym -> name,
- symaddr, ms_type, sym->udata, objfile);
- }
-
- /* See if this is a debugging symbol that helps Solaris
- stabs-in-elf debugging. */
-
- else if (sym->flags & BSF_FILE)
- {
- /* Chain any old one onto the objfile; remember new sym. */
- if (sectinfo)
- {
- sectinfo->next = dbx->stab_section_info;
- dbx->stab_section_info = sectinfo;
- sectinfo = 0;
- }
- filesym = sym;
- }
- else if ((sym->flags & BSF_LOCAL) &&
- (sym->section) &&
- (sym->section->flags & SEC_DATA) &&
- (sym->name))
- {
- /* Named Local variable in a Data section. Check its name. */
- index = -1;
- switch (sym->name[1])
- {
- case 'b':
- if (!strcmp ("Bbss.bss", sym->name))
- index = SECT_OFF_BSS;
- break;
- case 'd':
- if (!strcmp ("Ddata.data", sym->name))
- index = SECT_OFF_DATA;
- break;
- case 'r':
- if (!strcmp ("Drodata.rodata", sym->name))
- index = SECT_OFF_RODATA;
- break;
- }
- if (index > 0)
- {
- /* We have some new info. Allocate a sectinfo, if
- needed, and fill it in. */
- if (!sectinfo)
- {
- sectinfo = (struct stab_section_info *)
- xmmalloc (objfile -> md,
- sizeof (*sectinfo));
- memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
- if (!filesym)
- complain (§ion_info_complaint, (char *)sym->name);
- else
- sectinfo->filename = (char *)filesym->name;
- }
- if (sectinfo->sections[index])
- complain (§ion_info_dup_complaint,
- (char *)sectinfo->filename);
-
- symaddr = sym -> value;
- /* Relocate all non-absolute symbols by base address. */
- if (sym -> section != &bfd_abs_section)
- symaddr += addr;
- sectinfo->sections[index] = symaddr;
- }
+ size = ((elf_symbol_type *) sym) -> internal_elf_sym.st_size;
+ msym = record_minimal_symbol_and_info
+ ((char *) sym -> name, symaddr,
+ ms_type, (PTR) size, objfile);
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ if (msym != NULL)
+ msym->filename = filesymname;
+#endif
}
}
do_cleanups (back_to);
format to look for: FIXME!!!
dwarf_build_psymtabs() builds psymtabs for DWARF symbols;
- elfstab_build_psymtabs() handles STABS symbols.
+ elfstab_build_psymtabs() handles STABS symbols;
+ mdebug_build_psymtabs() handles ECOFF debugging information.
Note that ELF files have a "minimal" symbol table, which looks a lot
like a COFF symbol table, but has only the minimal information necessary
{
bfd *abfd = objfile->obfd;
struct elfinfo ei;
- struct dbx_symfile_info *dbx;
struct cleanup *back_to;
- asection *text_sect;
CORE_ADDR offset;
init_minimal_symbol_collection ();
memset ((char *) &ei, 0, sizeof (ei));
/* Allocate struct to keep track of the symfile */
- objfile->sym_private = (PTR)
+ objfile->sym_stab_info = (PTR)
xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
- memset ((char *) objfile->sym_private, 0, sizeof (struct dbx_symfile_info));
+ memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
make_cleanup (free_elfinfo, (PTR) objfile);
/* Process the normal ELF symbol table first. This may write some
- chain of info into the dbx_symfile_info in objfile->sym_private,
+ chain of info into the dbx_symfile_info in objfile->sym_stab_info,
which can later be used by elfstab_offset_sections. */
/* FIXME, should take a section_offsets param, not just an offset. */
offset = ANOFFSET (section_offsets, 0);
- elf_symtab_read (abfd, offset, objfile);
+ elf_symtab_read (abfd, offset, objfile, 0);
+
+ /* Add the dynamic symbols. */
+
+ elf_symtab_read (abfd, offset, objfile, 1);
/* Now process debugging information, which is contained in
special ELF sections. We first have to find them... */
if (ei.dboffset && ei.lnoffset)
{
/* DWARF sections */
- dwarf_build_psymtabs (fileno ((FILE *)(abfd -> iostream)),
- bfd_get_filename (abfd),
+ dwarf_build_psymtabs (objfile,
section_offsets, mainline,
ei.dboffset, ei.dbsize,
- ei.lnoffset, ei.lnsize, objfile);
+ ei.lnoffset, ei.lnsize);
}
if (ei.stabsect)
{
- /* STABS sections */
-
- /* FIXME: Sun didn't really know how to implement this well.
- They made .stab sections that don't point to the .stabstr
- section with the sh_link field. BFD doesn't make string table
- sections visible to the caller. So we have to search the
- ELF section table, not the BFD section table, for the string
- table. */
- struct elf_internal_shdr *elf_sect;
-
- elf_sect = bfd_elf_find_section (abfd, ".stabstr");
- if (elf_sect)
+ asection *str_sect;
+
+ /* Stab sections have an associated string table that looks like
+ a separate section. */
+ str_sect = bfd_get_section_by_name (abfd, ".stabstr");
+
+ /* FIXME should probably warn about a stab section without a stabstr. */
+ if (str_sect)
elfstab_build_psymtabs (objfile,
- section_offsets,
- mainline,
- ei.stabsect->filepos, /* .stab offset */
- bfd_get_section_size_before_reloc (ei.stabsect),/* .stab size */
- elf_sect->sh_offset, /* .stabstr offset */
- elf_sect->sh_size); /* .stabstr size */
+ section_offsets,
+ mainline,
+ ei.stabsect->filepos,
+ bfd_section_size (abfd, ei.stabsect),
+ str_sect->filepos,
+ bfd_section_size (abfd, str_sect));
}
-
- if (!have_partial_symbols ())
+ if (ei.mdebugsect)
{
- wrap_here ("");
- printf_filtered ("(no debugging symbols found)...");
- wrap_here ("");
+ const struct ecoff_debug_swap *swap;
+
+ /* .mdebug section, presumably holding ECOFF debugging
+ information. */
+ swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
+ if (swap)
+ elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect,
+ section_offsets);
}
/* Install any minimal symbols that have been collected as the current
do_cleanups (back_to);
}
-/* This cleans up the objfile's sym_private pointer, and the chain of
+/* This cleans up the objfile's sym_stab_info pointer, and the chain of
stab_section_info's, that might be dangling from it. */
static void
{
struct objfile *objfile = (struct objfile *)objp;
struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
- objfile->sym_private;
+ objfile->sym_stab_info;
struct stab_section_info *ssi, *nssi;
ssi = dbxinfo->stab_section_info;
elf_symfile_finish (objfile)
struct objfile *objfile;
{
- if (objfile -> sym_private != NULL)
+ if (objfile -> sym_stab_info != NULL)
{
- mfree (objfile -> md, objfile -> sym_private);
+ mfree (objfile -> md, objfile -> sym_stab_info);
}
}
just a stub. */
static void
-elf_symfile_init (ignore)
- struct objfile *ignore;
+elf_symfile_init (objfile)
+ struct objfile *objfile;
{
+ /* ELF objects may be reordered, so set OBJF_REORDERED. If we
+ find this causes a significant slowdown in gdb then we could
+ set it in the debug symbol readers only when necessary. */
+ objfile->flags |= OBJF_REORDERED;
}
/* ELF specific parsing routine for section offsets.
{
struct section_offsets *section_offsets;
int i;
-
+
+ objfile->num_sections = SECT_OFF_MAX;
section_offsets = (struct section_offsets *)
obstack_alloc (&objfile -> psymbol_obstack,
- sizeof (struct section_offsets) +
- sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
+ sizeof (struct section_offsets)
+ + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
for (i = 0; i < SECT_OFF_MAX; i++)
ANOFFSET (section_offsets, i) = addr;
-
+
return section_offsets;
}
\f
{
char *filename = pst->filename;
struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
- objfile->sym_private;
+ objfile->sym_stab_info;
struct stab_section_info *maybe = dbx->stab_section_info;
struct stab_section_info *questionable = 0;
int i;
for (; maybe; maybe = maybe->next)
{
if (filename[0] == maybe->filename[0]
- && !strcmp (filename, maybe->filename))
+ && STREQ (filename, maybe->filename))
{
/* We found a match. But there might be several source files
(from different directories) with the same name. */
complain (&stab_info_mismatch_complaint, filename);
}
\f
-/* Register that we are able to handle ELF object file formats and DWARF
- debugging formats.
-
- Unlike other object file formats, where the debugging information format
- is implied by the object file format, the ELF object file format and the
- DWARF debugging information format are two distinct, and potentially
- separate entities. I.E. it is perfectly possible to have ELF objects
- with debugging formats other than DWARF. And it is conceivable that the
- DWARF debugging format might be used with another object file format,
- like COFF, by simply using COFF's custom section feature.
-
- GDB, and to a lesser extent BFD, should support the notion of separate
- object file formats and debugging information formats. For now, we just
- use "elf" in the same sense as "a.out" or "coff", to imply both the ELF
- object file format and the DWARF debugging format. */
+/* Register that we are able to handle ELF object file formats. */
static struct sym_fns elf_sym_fns =
{
- "elf", /* sym_name: name or name prefix of BFD target type */
- 3, /* sym_namelen: number of significant sym_name chars */
+ bfd_target_elf_flavour,
elf_new_init, /* sym_new_init: init anything gbl to entire symtab */
elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */
elf_symfile_read, /* sym_read: read a symbol file into symtab */