/* Read ELF (Executable and Linking Format) object files for GDB.
- Copyright 1991, 92, 93, 94, 95, 96, 1998 Free Software Foundation, Inc.
+
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
Written by Fred Fish at Cygnus Support.
This file is part of GDB.
#include "complaints.h"
#include "demangle.h"
-extern void _initialize_elfread PARAMS ((void));
+extern void _initialize_elfread (void);
/* The struct elfinfo is available only during ELF symbol table and
psymtab reading. It is destroyed at the completion of psymtab-reading.
asection *mdebugsect; /* Section pointer for .mdebug section */
};
-/* Various things we might complain about... */
-
-struct complaint section_info_complaint =
-{"elf/stab section information %s without a preceding file symbol", 0, 0};
-
-struct complaint section_info_dup_complaint =
-{"duplicated elf/stab section information for %s", 0, 0};
-
-struct complaint stab_info_mismatch_complaint =
-{"elf/stab section information missing for %s", 0, 0};
-
-struct complaint stab_info_questionable_complaint =
-{"elf/stab section information questionable for %s", 0, 0};
-
-static void
-elf_symfile_init PARAMS ((struct objfile *));
-
-static void
-elf_new_init PARAMS ((struct objfile *));
-
-static void
-elf_symfile_read PARAMS ((struct objfile *, int));
-
-static void
-elf_symfile_finish PARAMS ((struct objfile *));
-
-static void
-elf_symtab_read PARAMS ((struct objfile *, int));
-
-static void
-free_elfinfo PARAMS ((void *));
-
-static struct minimal_symbol *
- record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
- enum minimal_symbol_type, char *,
- asection * bfd_section,
- struct objfile *));
-
-static void
-elf_locate_sections PARAMS ((bfd *, asection *, void *));
+static void free_elfinfo (void *);
/* We are called once per section from elf_symfile_read. We
need to examine each section we are passed, check to see
-kingdon). */
static void
-elf_locate_sections (ignore_abfd, sectp, eip)
- bfd *ignore_abfd;
- asection *sectp;
- PTR eip;
+elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
{
register struct elfinfo *ei;
#if 0 /* Currently unused */
char *
-elf_interpreter (abfd)
- bfd *abfd;
+elf_interpreter (bfd *abfd)
{
sec_ptr interp_sec;
unsigned size;
#endif
static struct minimal_symbol *
-record_minimal_symbol_and_info (name, address, ms_type, info, bfd_section,
- objfile)
- char *name;
- CORE_ADDR address;
- enum minimal_symbol_type ms_type;
- char *info; /* FIXME, is this really char *? */
- asection *bfd_section;
- struct objfile *objfile;
+record_minimal_symbol_and_info (char *name, CORE_ADDR address,
+ enum minimal_symbol_type ms_type, char *info, /* FIXME, is this really char *? */
+ asection *bfd_section, struct objfile *objfile)
{
- 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 (objfile);
-#ifdef SMASH_TEXT_ADDRESS
- SMASH_TEXT_ADDRESS (address);
-#endif
- break;
- case mst_data:
- case mst_file_data:
- section = SECT_OFF_DATA (objfile);
- break;
- case mst_bss:
- case mst_file_bss:
- section = SECT_OFF_BSS (objfile);
- break;
- default:
- section = -1;
- break;
- }
+ if (ms_type == mst_text || ms_type == mst_file_text)
+ address = SMASH_TEXT_ADDRESS (address);
return prim_record_minimal_symbol_and_info
- (name, address, ms_type, info, section, bfd_section, objfile);
+ (name, address, ms_type, info, bfd_section->index, bfd_section, objfile);
}
/*
*/
static void
-elf_symtab_read (objfile, dynamic)
- struct objfile *objfile;
- int dynamic;
+elf_symtab_read (struct objfile *objfile, int dynamic)
{
long storage_needed;
asymbol *sym;
if (storage_needed > 0)
{
symbol_table = (asymbol **) xmalloc (storage_needed);
- back_to = make_cleanup (free, symbol_table);
+ back_to = make_cleanup (xfree, symbol_table);
if (dynamic)
number_of_symbols = bfd_canonicalize_dynamic_symtab (objfile->obfd,
symbol_table);
if (number_of_symbols < 0)
error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
- /* FIXME: Should use section specific offset, not SECT_OFF_TEXT. */
- offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+
for (i = 0; i < number_of_symbols; i++)
{
sym = symbol_table[i];
continue;
}
+ offset = ANOFFSET (objfile->section_offsets, sym->section->index);
if (dynamic
&& sym->section == &bfd_und_section
&& (sym->flags & BSF_FUNCTION))
|| ((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). */
+ /* Looks like a compiler-generated label. Skip
+ it. The assembler should be skipping these (to
+ keep executables small), but apparently with
+ gcc on the (deleted) 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;
-#ifdef HARRIS_TARGET
- else if (sym->name[0] == '.' && sym->name[1] == '.')
- {
- /* Looks like a Harris compiler generated label for the
- purpose of marking instructions that are relevant to
- DWARF dies. The assembler can't get rid of these
- because they are relocatable addresses that the
- linker needs to resolve. */
- continue;
- }
-#endif
else
{
ms_type = mst_file_text;
}
else if (sym->section->flags & SEC_ALLOC)
{
- if (sym->flags & BSF_GLOBAL)
+ if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
{
if (sym->section->flags & SEC_LOAD)
{
{
sectinfo = (struct stab_section_info *)
xmmalloc (objfile->md, sizeof (*sectinfo));
- memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
+ memset (sectinfo, 0,
+ sizeof (*sectinfo));
if (filesym == NULL)
{
- complain (§ion_info_complaint,
- sym->name);
+ complaint (&symfile_complaints,
+ "elf/stab section information %s without a preceding file symbol",
+ sym->name);
}
else
{
(char *) filesym->name;
}
}
- if (sectinfo->sections[index] != 0)
- {
- complain (§ion_info_dup_complaint,
- sectinfo->filename);
+ if (index != -1)
+ {
+ if (sectinfo->sections[index] != 0)
+ {
+ complaint (&symfile_complaints,
+ "duplicated elf/stab section information for %s",
+ sectinfo->filename);
+ }
}
+ else
+ internal_error (__FILE__, __LINE__,
+ "Section index uninitialized.");
/* Bfd symbols are section relative. */
symaddr = sym->value + sym->section->vma;
/* Relocate non-absolute symbols by the section offset. */
{
symaddr += offset;
}
- sectinfo->sections[index] = symaddr;
+ if (index != -1)
+ sectinfo->sections[index] = symaddr;
+ else
+ internal_error (__FILE__, __LINE__,
+ "Section index uninitialized.");
/* The special local symbols don't go in the
minimal symbol table, so ignore this one. */
continue;
size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
msym = record_minimal_symbol_and_info
((char *) sym->name, symaddr,
- ms_type, (PTR) size, sym->section, objfile);
+ ms_type, (void *) size, sym->section, objfile);
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
if (msym != NULL)
msym->filename = filesymname;
#endif
-#ifdef ELF_MAKE_MSYMBOL_SPECIAL
ELF_MAKE_MSYMBOL_SPECIAL (sym, msym);
-#endif
}
}
do_cleanups (back_to);
capability even for files compiled without -g. */
static void
-elf_symfile_read (objfile, mainline)
- struct objfile *objfile;
- int mainline;
+elf_symfile_read (struct objfile *objfile, int mainline)
{
bfd *abfd = objfile->obfd;
struct elfinfo ei;
CORE_ADDR offset;
init_minimal_symbol_collection ();
- back_to = make_cleanup ((make_cleanup_func) discard_minimal_symbols, 0);
+ back_to = make_cleanup_discard_minimal_symbols ();
memset ((char *) &ei, 0, sizeof (ei));
objfile->sym_stab_info = (struct dbx_symfile_info *)
xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
- make_cleanup (free_elfinfo, (PTR) objfile);
+ 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->sym_stab_info,
elf_symtab_read (objfile, 1);
+ /* Install any minimal symbols that have been collected as the current
+ minimal symbols for this objfile. The debug readers below this point
+ should not generate new minimal symbols; if they do it's their
+ responsibility to install them. "mdebug" appears to be the only one
+ which will do this. */
+
+ install_minimal_symbols (objfile);
+ do_cleanups (back_to);
+
/* Now process debugging information, which is contained in
special ELF sections. */
}
/* We first have to find them... */
- bfd_map_over_sections (abfd, elf_locate_sections, (PTR) & ei);
+ bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
/* ELF debugging information is inserted into the psymtab in the
order of least informative first - most informative last. Since
if (str_sect)
elfstab_build_psymtabs (objfile,
mainline,
- ei.stabsect->filepos,
- bfd_section_size (abfd, ei.stabsect),
+ ei.stabsect,
str_sect->filepos,
bfd_section_size (abfd, str_sect));
}
ei.lnoffset, ei.lnsize);
}
- /* Install any minimal symbols that have been collected as the current
- minimal symbols for this objfile. */
-
- install_minimal_symbols (objfile);
-
- do_cleanups (back_to);
+ if (DWARF2_BUILD_FRAME_INFO_P ())
+ DWARF2_BUILD_FRAME_INFO(objfile);
}
/* 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
-free_elfinfo (objp)
- PTR objp;
+free_elfinfo (void *objp)
{
struct objfile *objfile = (struct objfile *) objp;
struct dbx_symfile_info *dbxinfo = objfile->sym_stab_info;
while (ssi)
{
nssi = ssi->next;
- mfree (objfile->md, ssi);
+ xmfree (objfile->md, ssi);
ssi = nssi;
}
We reinitialize buildsym, since we may be reading stabs from an ELF file. */
static void
-elf_new_init (ignore)
- struct objfile *ignore;
+elf_new_init (struct objfile *ignore)
{
stabsread_new_init ();
buildsym_new_init ();
objfile struct from the global list of known objfiles. */
static void
-elf_symfile_finish (objfile)
- struct objfile *objfile;
+elf_symfile_finish (struct objfile *objfile)
{
if (objfile->sym_stab_info != NULL)
{
- mfree (objfile->md, objfile->sym_stab_info);
+ xmfree (objfile->md, objfile->sym_stab_info);
}
}
just a stub. */
static void
-elf_symfile_init (objfile)
- struct objfile *objfile;
+elf_symfile_init (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
with wierd names. Go get 'em when needed. */
void
-elfstab_offset_sections (objfile, pst)
- struct objfile *objfile;
- struct partial_symtab *pst;
+elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
{
char *filename = pst->filename;
struct dbx_symfile_info *dbx = objfile->sym_stab_info;
if (maybe == 0 && questionable != 0)
{
- complain (&stab_info_questionable_complaint, filename);
+ complaint (&symfile_complaints,
+ "elf/stab section information questionable for %s", filename);
maybe = questionable;
}
pst->section_offsets = (struct section_offsets *)
obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
for (i = 0; i < SECT_OFF_MAX; i++)
- ANOFFSET (pst->section_offsets, i) = maybe->sections[i];
+ (pst->section_offsets)->offsets[i] = maybe->sections[i];
return;
}
/* We were unable to find any offsets for this file. Complain. */
if (dbx->stab_section_info) /* If there *is* any info, */
- complain (&stab_info_mismatch_complaint, filename);
+ complaint (&symfile_complaints,
+ "elf/stab section information missing for %s", filename);
}
\f
/* Register that we are able to handle ELF object file formats. */
};
void
-_initialize_elfread ()
+_initialize_elfread (void)
{
add_symtab_fns (&elf_sym_fns);
}