/* Read ELF (Executable and Linking Format) object files for GDB.
- Copyright 1991, 1992, 1993, 1994 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. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
#include "bfd.h"
-#include <time.h> /* For time_t in libbfd.h. */
-#include <sys/types.h> /* For time_t, if not in time.h. */
-#include "libbfd.h" /* For bfd_elf_find_section */
-#include "libelf.h"
+#include "gdb_string.h"
+#include "elf-bfd.h"
#include "elf/mips.h"
#include "symtab.h"
#include "symfile.h"
#include "stabsread.h"
#include "gdb-stabs.h"
#include "complaints.h"
-#include <string.h>
#include "demangle.h"
/* The struct elfinfo is available only during ELF symbol table and
static struct section_offsets *
elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-static void
+static struct minimal_symbol *
record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
enum minimal_symbol_type, char *,
struct objfile *));
#endif
-static void
+static struct minimal_symbol *
record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
char *name;
CORE_ADDR address;
}
name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
- objfile);
+ 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
/* 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_stab_info;
unsigned long size;
int stripped = (bfd_get_symcount (abfd) == 0);
if (dynamic)
- storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
+ {
+ 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 ()));
+ {
+ 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);
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.
- On Irix 5 however, the symbols for the procedure linkage
- table entries have meaningful values only in the dynamic
- symbol table, so we always examine undefined symbols. */
- if (dynamic && !stripped && sym -> section != &bfd_und_section)
+ of the main symbol table. */
+ if (dynamic && !stripped)
continue;
if (sym -> flags & BSF_FILE)
{
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. */
/* 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 == &bfd_und_section
- && (sym -> flags & BSF_GLOBAL)
- && (sym -> flags & BSF_FUNCTION))
- {
- /* Symbol is a reference to a function defined in
- a shared library.
- If its value is non zero then it is usually the
- absolute address of the corresponding entry in
- the procedure linkage table.
- 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.
- Irix 5 has a zero value for all shared library functions
- in the main symbol table, but the dynamic symbol table
- provides the right values. */
- ms_type = mst_solib_trampoline;
- symaddr = sym -> value;
- if (symaddr == 0)
- continue;
- }
- else if (sym -> section == &bfd_abs_section)
+ if (sym -> section == &bfd_abs_section)
{
/* This is a hack to get the minimal symbol type
right for Irix 5, which has absolute adresses
{
ms_type = mst_text;
}
- else if (sym->name[0] == '.' && sym->name[1] == 'L')
+ 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
}
/* Pass symbol size field in via BFD. FIXME!!! */
size = ((elf_symbol_type *) sym) -> internal_elf_sym.st_size;
- record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
- ms_type, (PTR) size, objfile);
+ 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);
offset = ANOFFSET (section_offsets, 0);
elf_symtab_read (abfd, offset, objfile, 0);
- /* Add the dynamic symbols if we are reading the main symbol table. */
+ /* Add the dynamic symbols. */
- if (mainline)
- elf_symtab_read (abfd, offset, objfile, 1);
+ 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.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 elf32_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 */
- (file_ptr) 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 (ei.mdebugsect)
{
section_offsets);
}
- if (!have_partial_symbols ())
- {
- wrap_here ("");
- printf_filtered ("(no debugging symbols found)...");
- wrap_here ("");
- }
-
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */
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.