* mips-tdep.c (init_extra_frame_info): Use frame relative stack
[deliverable/binutils-gdb.git] / gdb / elfread.c
index 84d4f1fdb4e5d487516a5a3aba813e803838d57e..9b5b34c56926636efea888040892539213d85b82 100644 (file)
@@ -20,6 +20,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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 "symtab.h"
@@ -43,6 +45,7 @@ struct elfinfo {
   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... */
@@ -75,7 +78,7 @@ static void
 elf_symtab_read PARAMS ((bfd *,  CORE_ADDR, struct objfile *));
 
 static void
-free_elfinfo PARAMS ((PTR));
+free_elfinfo PARAMS ((void *));
 
 static struct section_offsets *
 elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
@@ -86,7 +89,7 @@ record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
                                        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
@@ -102,7 +105,10 @@ elf_locate_sections PARAMS ((bfd *, asection *, PTR));
    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)
@@ -131,6 +137,10 @@ elf_locate_sections (ignore_abfd, sectp, eip)
     {
       ei -> stabindexsect = sectp;
     }
+  else if (STREQ (sectp -> name, ".mdebug"))
+    {
+      ei -> mdebugsect = sectp;
+    }
 }
 
 #if 0  /* Currently unused */
@@ -171,8 +181,32 @@ record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
      char *info;               /* FIXME, is this really char *? */
      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;
+      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;
+    }
+
   name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
-  prim_record_minimal_symbol_and_info (name, address, ms_type, info, -1);
+  prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
+                                      objfile);
 }
 
 /*
@@ -223,7 +257,7 @@ elf_symtab_read (abfd, addr, objfile)
      seen any section info for it yet.  */
   asymbol *filesym = 0;
   struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
-                                objfile->sym_private;
+                                objfile->sym_stab_info;
   unsigned long size;
   
   storage_needed = get_symtab_upper_bound (abfd);
@@ -291,11 +325,11 @@ elf_symtab_read (abfd, addr, objfile)
                      ms_type = mst_file_text;
                    }
                }
-             else if (sym -> section -> flags & SEC_DATA)
+             else if (sym -> section -> flags & SEC_ALLOC)
                {
                  if (sym -> flags & BSF_GLOBAL)
                    {
-                     if (sym -> section -> flags & SEC_HAS_CONTENTS)
+                     if (sym -> section -> flags & SEC_LOAD)
                        {
                          ms_type = mst_data;
                        }
@@ -363,7 +397,7 @@ elf_symtab_read (abfd, addr, objfile)
                        }
                      /* Not a special stabs-in-elf symbol, do regular
                         symbol processing. */
-                     if (sym -> section -> flags & SEC_HAS_CONTENTS)
+                     if (sym -> section -> flags & SEC_LOAD)
                        {
                          ms_type = mst_file_data;
                        }
@@ -419,7 +453,8 @@ elf_symtab_read (abfd, addr, objfile)
    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
@@ -444,13 +479,13 @@ elf_symfile_read (objfile, section_offsets, mainline)
   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.  */
@@ -491,6 +526,17 @@ elf_symfile_read (objfile, section_offsets, mainline)
          (file_ptr) elf_sect->sh_offset,               /* .stabstr offset */
          elf_sect->sh_size);                           /* .stabstr size */
     }
+  if (ei.mdebugsect)
+    {
+      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);
+    }
 
   if (!have_partial_symbols ())
     {
@@ -507,7 +553,7 @@ elf_symfile_read (objfile, section_offsets, mainline)
   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
@@ -516,7 +562,7 @@ free_elfinfo (objp)
 {
   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;
@@ -554,9 +600,9 @@ static void
 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);
     }
 }
 
@@ -587,15 +633,16 @@ elf_symfile_offsets (objfile, addr)
 {
   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
@@ -614,7 +661,7 @@ elfstab_offset_sections (objfile, pst)
 {
   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;
@@ -666,26 +713,11 @@ elfstab_offset_sections (objfile, pst)
     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 */
This page took 0.027382 seconds and 4 git commands to generate.