* config/tc-xtensa.c (xtensa_mark_literal_pool_location): Remove
[deliverable/binutils-gdb.git] / gdb / elfread.c
index a29a71b544d0b2f5149202c17b661f125ae72029..a655797484fadfc40cb3a0817037b15b975439d2 100644 (file)
@@ -1,7 +1,8 @@
 /* Read ELF (Executable and Linking Format) object files for GDB.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002
-   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.
@@ -52,20 +53,6 @@ struct elfinfo
     asection *mdebugsect;      /* Section pointer for .mdebug section */
   };
 
-/* Various things we might complain about... */
-
-struct deprecated_complaint section_info_complaint =
-{"elf/stab section information %s without a preceding file symbol", 0, 0};
-
-struct deprecated_complaint section_info_dup_complaint =
-{"duplicated elf/stab section information for %s", 0, 0};
-
-struct deprecated_complaint stab_info_mismatch_complaint =
-{"elf/stab section information missing for %s", 0, 0};
-
-struct deprecated_complaint stab_info_questionable_complaint =
-{"elf/stab section information questionable for %s", 0, 0};
-
 static void free_elfinfo (void *);
 
 /* We are called once per section from elf_symfile_read.  We
@@ -190,7 +177,6 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
   asymbol **symbol_table;
   long number_of_symbols;
   long i;
-  int index;
   struct cleanup *back_to;
   CORE_ADDR symaddr;
   CORE_ADDR offset;
@@ -360,10 +346,10 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
                    /* Looks like a compiler-generated label.  Skip
                       it.  The assembler should be skipping these (to
                       keep executables small), but apparently with
-                      gcc on the (OBSOLETE) 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).  */
+                      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;
                  else
                    {
@@ -385,38 +371,45 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
                    }
                  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 (objfile);
-                       }
-                     else if (STREQ ("Ddata.data", sym->name))
-                       {
-                         index = SECT_OFF_DATA (objfile);
-                       }
-                     else if (STREQ ("Drodata.rodata", sym->name))
-                       {
-                         index = SECT_OFF_RODATA (objfile);
-                       }
-                     if (index != SECT_OFF_MAX)
+                     /* 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'.  */
+                     int special_local_sect;
+                     if (strcmp ("Bbss.bss", sym->name) == 0)
+                       special_local_sect = SECT_OFF_BSS (objfile);
+                     else if (strcmp ("Ddata.data", sym->name) == 0)
+                       special_local_sect = SECT_OFF_DATA (objfile);
+                     else if (strcmp ("Drodata.rodata", sym->name) == 0)
+                       special_local_sect = SECT_OFF_RODATA (objfile);
+                     else
+                       special_local_sect = -1;
+                     if (special_local_sect >= 0)
                        {
                          /* Found a special local symbol.  Allocate a
                             sectinfo, if needed, and fill it in.  */
                          if (sectinfo == NULL)
                            {
+                             int max_index;
+                             size_t size;
+
+                             max_index 
+                               = max (SECT_OFF_BSS (objfile),
+                                      max (SECT_OFF_DATA (objfile),
+                                           SECT_OFF_RODATA (objfile)));
+                             size = (sizeof (struct stab_section_info) 
+                                     + (sizeof (CORE_ADDR)
+                                        * (max_index - 1)));
                              sectinfo = (struct stab_section_info *)
-                               xmmalloc (objfile->md, sizeof (*sectinfo));
-                             memset (sectinfo, 0,
-                                     sizeof (*sectinfo));
+                               xmmalloc (objfile->md, size);
+                             memset (sectinfo, 0, size);
+                             sectinfo->num_sections = max_index;
                              if (filesym == NULL)
                                {
-                                 complain (&section_info_complaint,
-                                           sym->name);
+                                 complaint (&symfile_complaints,
+                                            "elf/stab section information %s without a preceding file symbol",
+                                            sym->name);
                                }
                              else
                                {
@@ -424,35 +417,23 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
                                    (char *) filesym->name;
                                }
                            }
-                         if (index != -1)
-                           { 
-                             if (sectinfo->sections[index] != 0)
-                               {
-                                 complain (&section_info_dup_complaint,
-                                           sectinfo->filename);
-                               }
-                           }
-                         else
-                           internal_error (__FILE__, __LINE__,
-                                           "Section index uninitialized.");
-                         /* Bfd symbols are section relative. */
+                         if (sectinfo->sections[special_local_sect] != 0)
+                           complaint (&symfile_complaints,
+                                      "duplicated elf/stab section information for %s",
+                                      sectinfo->filename);
+                         /* BFD symbols are section relative.  */
                          symaddr = sym->value + sym->section->vma;
-                         /* Relocate non-absolute symbols by the section offset. */
+                         /* Relocate non-absolute symbols by the
+                             section offset.  */
                          if (sym->section != &bfd_abs_section)
-                           {
-                             symaddr += offset;
-                           }
-                         if (index != -1)
-                           sectinfo->sections[index] = symaddr;
-                         else
-                           internal_error (__FILE__, __LINE__,
-                                           "Section index uninitialized.");
+                           symaddr += offset;
+                         sectinfo->sections[special_local_sect] = symaddr;
                          /* The special local symbols don't go in the
-                            minimal symbol table, so ignore this one. */
+                            minimal symbol table, so ignore this one.  */
                          continue;
                        }
                      /* Not a special stabs-in-elf symbol, do regular
-                        symbol processing. */
+                        symbol processing.  */
                      if (sym->section->flags & SEC_LOAD)
                        {
                          ms_type = mst_file_data;
@@ -553,6 +534,15 @@ elf_symfile_read (struct objfile *objfile, int mainline)
 
   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. */
 
@@ -602,8 +592,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
       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));
     }
@@ -621,15 +610,9 @@ elf_symfile_read (struct objfile *objfile, int mainline)
                            ei.lnoffset, ei.lnsize);
     }
 
-  if (DWARF2_BUILD_FRAME_INFO_P ())
-    DWARF2_BUILD_FRAME_INFO(objfile);
-
-  /* Install any minimal symbols that have been collected as the current
-     minimal symbols for this objfile. */
-
-  install_minimal_symbols (objfile);
-
-  do_cleanups (back_to);
+  /* FIXME: kettenis/20030504: This still needs to be integrated with
+     dwarf2read.c in a better way.  */
+  dwarf2_build_frame_info (objfile);
 }
 
 /* This cleans up the objfile's sym_stab_info pointer, and the chain of
@@ -740,7 +723,8 @@ elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
 
   if (maybe == 0 && questionable != 0)
     {
-      complain (&stab_info_questionable_complaint, filename);
+      complaint (&symfile_complaints,
+                "elf/stab section information questionable for %s", filename);
       maybe = questionable;
     }
 
@@ -749,15 +733,17 @@ elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
       /* Found it!  Allocate a new psymtab struct, and fill it in.  */
       maybe->found++;
       pst->section_offsets = (struct section_offsets *)
-       obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
-      for (i = 0; i < SECT_OFF_MAX; i++)
+       obstack_alloc (&objfile->psymbol_obstack, 
+                      SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
+      for (i = 0; i < maybe->num_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.  */
This page took 0.026948 seconds and 4 git commands to generate.