spelling fix.
[deliverable/binutils-gdb.git] / gdb / elfread.c
index 107bdafa37e4489aa0438df9315b5f15fe2ce67a..417039e044de61f39a31c4fcd71fefbe68654945 100644 (file)
@@ -1,5 +1,5 @@
 /* Read ELF (Executable and Linking Format) object files for GDB.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright 1991, 92, 93, 94, 95, 96, 1998 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
 This file is part of GDB.
@@ -81,6 +81,7 @@ 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
@@ -169,11 +170,13 @@ elf_interpreter (abfd)
 #endif
 
 static struct minimal_symbol *
-record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
+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;
 {
   int section;
@@ -203,7 +206,7 @@ record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
     }
 
   return prim_record_minimal_symbol_and_info
-    (name, address, ms_type, info, section, objfile);
+    (name, address, ms_type, info, section, bfd_section, objfile);
 }
 
 /*
@@ -258,8 +261,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
   /* 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;
+  struct dbx_symfile_info *dbx = objfile->sym_stab_info;
   unsigned long size;
   int stripped = (bfd_get_symcount (abfd) == 0);
  
@@ -320,7 +322,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
              symaddr += addr;
              msym = record_minimal_symbol_and_info
                ((char *) sym -> name, symaddr,
-               mst_solib_trampoline, NULL, objfile);
+               mst_solib_trampoline, NULL, sym -> section, objfile);
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
              if (msym != NULL)
                msym->filename = filesymname;
@@ -389,6 +391,15 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
                    default:
                      ms_type = mst_abs;
                    }
+
+                 /* If it is an Irix dynamic symbol, skip section name
+                    symbols, relocate all others. */
+                 if (ms_type != mst_abs)
+                   {
+                     if (sym->name[0] == '.')
+                       continue;
+                     symaddr += addr;
+                   }
                }
              else if (sym -> section -> flags & SEC_CODE)
                {
@@ -522,10 +533,13 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
              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);
+                ms_type, (PTR) 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
            }
        }
@@ -577,12 +591,12 @@ elf_symfile_read (objfile, section_offsets, mainline)
   CORE_ADDR offset;
 
   init_minimal_symbol_collection ();
-  back_to = make_cleanup (discard_minimal_symbols, 0);
+  back_to = make_cleanup ((make_cleanup_func) discard_minimal_symbols, 0);
 
   memset ((char *) &ei, 0, sizeof (ei));
 
   /* Allocate struct to keep track of the symfile */
-  objfile->sym_stab_info = (PTR)
+  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);
@@ -600,21 +614,42 @@ elf_symfile_read (objfile, section_offsets, mainline)
   elf_symtab_read (abfd, offset, objfile, 1);
 
   /* Now process debugging information, which is contained in
-     special ELF sections.  We first have to find them... */
+     special ELF sections. */
 
-  bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
-  if (dwarf2_has_info (abfd) && !offset)
+  /* If we are reinitializing, or if we have never loaded syms yet,
+     set table to empty.  MAINLINE is cleared so that *_read_psymtab
+     functions do not all also re-initialize the psymbol table. */
+  if (mainline)
     {
-      /* DWARF 2 sections */
-      dwarf2_build_psymtabs (objfile, section_offsets, mainline);
+      init_psymbol_list (objfile, 0);
+      mainline = 0;
     }
-  else if (ei.dboffset && ei.lnoffset)
+
+  /* We first have to find them... */
+  bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
+
+  /* ELF debugging information is inserted into the psymtab in the
+     order of least informative first - most informative last.  Since
+     the psymtab table is searched `most recent insertion first' this
+     increases the probability that more detailed debug information
+     for a section is found.
+
+     For instance, an object file might contain both .mdebug (XCOFF)
+     and .debug_info (DWARF2) sections then .mdebug is inserted first
+     (searched last) and DWARF2 is inserted last (searched first).  If
+     we don't do this then the XCOFF info is found first - for code in
+     an included file XCOFF info is useless. */
+
+  if (ei.mdebugsect)
     {
-      /* DWARF sections */
-      dwarf_build_psymtabs (objfile,
-                           section_offsets, mainline,
-                           ei.dboffset, ei.dbsize,
-                           ei.lnoffset, ei.lnsize);
+      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 (ei.stabsect)
     {
@@ -634,16 +669,18 @@ elf_symfile_read (objfile, section_offsets, mainline)
                                str_sect->filepos,
                                bfd_section_size (abfd, str_sect));
     }
-  if (ei.mdebugsect)
+  if (dwarf2_has_info (abfd))
     {
-      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);
+      /* DWARF 2 sections */
+      dwarf2_build_psymtabs (objfile, section_offsets, mainline);
+    }
+  else if (ei.dboffset && ei.lnoffset)
+    {
+      /* DWARF sections */
+      dwarf_build_psymtabs (objfile,
+                           section_offsets, mainline,
+                           ei.dboffset, ei.dbsize,
+                           ei.lnoffset, ei.lnsize);
     }
 
   /* Install any minimal symbols that have been collected as the current
@@ -662,8 +699,7 @@ free_elfinfo (objp)
      PTR objp;
 {
   struct objfile *objfile = (struct objfile *)objp;
-  struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
-                                    objfile->sym_stab_info;
+  struct dbx_symfile_info *dbxinfo = objfile->sym_stab_info;
   struct stab_section_info *ssi, *nssi;
 
   ssi = dbxinfo->stab_section_info;
@@ -740,8 +776,7 @@ elfstab_offset_sections (objfile, pst)
      struct partial_symtab *pst;
 {
   char *filename = pst->filename;
-  struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
-                                objfile->sym_stab_info;
+  struct dbx_symfile_info *dbx = objfile->sym_stab_info;
   struct stab_section_info *maybe = dbx->stab_section_info;
   struct stab_section_info *questionable = 0;
   int i;
This page took 0.026406 seconds and 4 git commands to generate.