* serial.h (SERIAL_SET_TTY_STATE): Comment return value.
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index 541941a1d507f240a2920fb42bc438e4488be3ba..4358f65de089733b2445f10ebb7dc10de686262b 100644 (file)
@@ -26,6 +26,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "symtab.h"
 #include "symfile.h"
 #include "objfiles.h"
+#include "gdb-stabs.h"
+#include "target.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -75,33 +77,38 @@ add_to_objfile_sections (abfd, asect, objfile_p_char)
   flagword aflag;
 
   aflag = bfd_get_section_flags (abfd, asect);
-  /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
-  if (!(aflag & SEC_LOAD))
+  if (!(aflag & SEC_ALLOC))
     return;
   if (0 == bfd_section_size (abfd, asect))
     return;
   section.offset = 0;
+  section.objfile = objfile;
   section.sec_ptr = asect;
   section.addr = bfd_section_vma (abfd, asect);
   section.endaddr = section.addr + bfd_section_size (abfd, asect);
   obstack_grow (&objfile->psymbol_obstack, &section, sizeof(section));
-  objfile->sections_end = (struct obj_section *) (((int) objfile->sections_end) + 1);
+  objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1);
 }
 
 /* Builds a section table for OBJFILE.
-   Returns 0 if OK, 1 on error.  */
+   Returns 0 if OK, 1 on error (in which case bfd_error contains the
+   error).  */
 
-static int
+int
 build_objfile_section_table (objfile)
      struct objfile *objfile;
 {
-  if (objfile->sections)
-    abort();
+  /* objfile->sections can be already set when reading a mapped symbol
+     file.  I believe that we do need to rebuild the section table in
+     this case (we rebuild other things derived from the bfd), but we
+     can't free the old one (it's in the psymbol_obstack).  So we just
+     waste some memory.  */
 
   objfile->sections_end = 0;
   bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *)objfile);
-  objfile->sections = obstack_finish (&objfile->psymbol_obstack);
-  objfile->sections_end = objfile->sections + (int) objfile->sections_end;
+  objfile->sections = (struct obj_section *)
+    obstack_finish (&objfile->psymbol_obstack);
+  objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
   return(0);
 }
 
@@ -116,79 +123,88 @@ allocate_objfile (abfd, mapped)
      int mapped;
 {
   struct objfile *objfile = NULL;
-  int fd;
-  void *md;
-  CORE_ADDR mapto;
 
   mapped |= mapped_symbol_files;
 
 #if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
+  {
 
-  /* If we can support mapped symbol files, try to open/reopen the mapped file
-     that corresponds to the file from which we wish to read symbols.  If the
-     objfile is to be mapped, we must malloc the structure itself using the
-     mmap version, and arrange that all memory allocation for the objfile uses
-     the mmap routines.  If we are reusing an existing mapped file, from which
-     we get our objfile pointer, we have to make sure that we update the
-     pointers to the alloc/free functions in the obstack, in case these
-     functions have moved within the current gdb. */
-
-  fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
-                        mapped);
-  if (fd >= 0)
-    {
-      if (((mapto = map_to_address ()) == 0) ||
-         ((md = mmalloc_attach (fd, (void *) mapto)) == NULL))
-       {
-         close (fd);
-       }
-      else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
-       {
-         /* Update memory corruption handler function addresses. */
-         init_malloc (md);
-         objfile -> md = md;
-         objfile -> mmfd = fd;
-         /* Update pointers to functions to *our* copies */
-         obstack_chunkfun (&objfile -> psymbol_obstack, xmmalloc);
-         obstack_freefun (&objfile -> psymbol_obstack, mfree);
-         obstack_chunkfun (&objfile -> symbol_obstack, xmmalloc);
-         obstack_freefun (&objfile -> symbol_obstack, mfree);
-         obstack_chunkfun (&objfile -> type_obstack, xmmalloc);
-         obstack_freefun (&objfile -> type_obstack, mfree);
-         /* If already in objfile list, unlink it. */
-         unlink_objfile (objfile);
-         /* Forget things specific to a particular gdb, may have changed. */
-         objfile -> sf = NULL;
-       }
-      else
-       {
-         /* Set up to detect internal memory corruption.  MUST be done before
-            the first malloc.  See comments in init_malloc() and mmcheck(). */
-         init_malloc (md);
-         objfile = (struct objfile *) xmmalloc (md, sizeof (struct objfile));
-         memset (objfile, 0, sizeof (struct objfile));
-         objfile -> md = md;
-         objfile -> mmfd = fd;
-         objfile -> flags |= OBJF_MAPPED;
-         mmalloc_setkey (objfile -> md, 0, objfile);
-         obstack_specify_allocation_with_arg (&objfile -> psymbol_obstack,
-                                              0, 0, xmmalloc, mfree,
-                                              objfile -> md);
-         obstack_specify_allocation_with_arg (&objfile -> symbol_obstack,
-                                              0, 0, xmmalloc, mfree,
-                                              objfile -> md);
-         obstack_specify_allocation_with_arg (&objfile -> type_obstack,
-                                              0, 0, xmmalloc, mfree,
-                                              objfile -> md);
-       }
-    }
+    /* If we can support mapped symbol files, try to open/reopen the
+       mapped file that corresponds to the file from which we wish to
+       read symbols.  If the objfile is to be mapped, we must malloc
+       the structure itself using the mmap version, and arrange that
+       all memory allocation for the objfile uses the mmap routines.
+       If we are reusing an existing mapped file, from which we get
+       our objfile pointer, we have to make sure that we update the
+       pointers to the alloc/free functions in the obstack, in case
+       these functions have moved within the current gdb.  */
+
+    int fd;
+
+    fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
+                          mapped);
+    if (fd >= 0)
+      {
+       CORE_ADDR mapto;
+       PTR md;
 
-  if (mapped && (objfile == NULL))
-    {
-      warning ("symbol table for '%s' will not be mapped",
-              bfd_get_filename (abfd));
-    }
+       if (((mapto = map_to_address ()) == 0) ||
+           ((md = mmalloc_attach (fd, (PTR) mapto)) == NULL))
+         {
+           close (fd);
+         }
+       else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
+         {
+           /* Update memory corruption handler function addresses. */
+           init_malloc (md);
+           objfile -> md = md;
+           objfile -> mmfd = fd;
+           /* Update pointers to functions to *our* copies */
+           obstack_chunkfun (&objfile -> psymbol_obstack, xmmalloc);
+           obstack_freefun (&objfile -> psymbol_obstack, mfree);
+           obstack_chunkfun (&objfile -> symbol_obstack, xmmalloc);
+           obstack_freefun (&objfile -> symbol_obstack, mfree);
+           obstack_chunkfun (&objfile -> type_obstack, xmmalloc);
+           obstack_freefun (&objfile -> type_obstack, mfree);
+           /* If already in objfile list, unlink it. */
+           unlink_objfile (objfile);
+           /* Forget things specific to a particular gdb, may have changed. */
+           objfile -> sf = NULL;
+         }
+       else
+         {
 
+           /* Set up to detect internal memory corruption.  MUST be
+              done before the first malloc.  See comments in
+              init_malloc() and mmcheck().  */
+
+           init_malloc (md);
+
+           objfile = (struct objfile *)
+             xmmalloc (md, sizeof (struct objfile));
+           memset (objfile, 0, sizeof (struct objfile));
+           objfile -> md = md;
+           objfile -> mmfd = fd;
+           objfile -> flags |= OBJF_MAPPED;
+           mmalloc_setkey (objfile -> md, 0, objfile);
+           obstack_specify_allocation_with_arg (&objfile -> psymbol_obstack,
+                                                0, 0, xmmalloc, mfree,
+                                                objfile -> md);
+           obstack_specify_allocation_with_arg (&objfile -> symbol_obstack,
+                                                0, 0, xmmalloc, mfree,
+                                                objfile -> md);
+           obstack_specify_allocation_with_arg (&objfile -> type_obstack,
+                                                0, 0, xmmalloc, mfree,
+                                                objfile -> md);
+         }
+      }
+
+    if (mapped && (objfile == NULL))
+      {
+       warning ("symbol table for '%s' will not be mapped",
+                bfd_get_filename (abfd));
+      }
+  }
 #else  /* defined(NO_MMALLOC) || !defined(HAVE_MMAP) */
 
   if (mapped)
@@ -300,8 +316,6 @@ void
 free_objfile (objfile)
      struct objfile *objfile;
 {
-  int mmfd;
-
   /* First do any symbol file specific actions required when we are
      finished with a particular symbol file.  Note that if the objfile
      is using reusable symbol information (via mmalloc) then each of
@@ -334,10 +348,19 @@ free_objfile (objfile)
      is unknown, but we play it safe for now and keep each action until
      it is shown to be no longer needed. */
      
-  clear_symtab_users_once ();
 #if defined (CLEAR_SOLIB)
   CLEAR_SOLIB ();
+  /* CLEAR_SOLIB closes the bfd's for any shared libraries.  But
+     the to_sections for a core file might refer to those bfd's.  So
+     detach any core file.  */
+  {
+    struct target_ops *t = find_core_target ();
+    if (t != NULL)
+      (t->to_detach) (NULL, 0);
+  }
 #endif
+  /* I *think* all our callers call clear_symtab_users.  If so, no need
+     to call this here.  */
   clear_pc_function_cache ();
 
   /* The last thing we do is free the objfile struct itself for the
@@ -351,6 +374,8 @@ free_objfile (objfile)
     {
       /* Remember the fd so we can close it.  We can't close it before
         doing the detach, and after the detach the objfile is gone. */
+      int mmfd;
+
       mmfd = objfile -> mmfd;
       mmalloc_detach (objfile -> md);
       objfile = NULL;
@@ -382,7 +407,7 @@ free_objfile (objfile)
 }
 
 
-/* Free all the object files at once.  */
+/* Free all the object files at once and clean up their users.  */
 
 void
 free_all_objfiles ()
@@ -393,6 +418,7 @@ free_all_objfiles ()
     {
       free_objfile (objfile);
     }
+  clear_symtab_users ();
 }
 \f
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
@@ -471,10 +497,40 @@ objfile_relocate (objfile, new_offsets)
       }
   }
 
+  {
+    struct partial_symtab *p;
+
+    ALL_OBJFILE_PSYMTABS (objfile, p)
+      {
+       /* FIXME: specific to symbol readers which use gdb-stabs.h.
+          We can only get away with it since objfile_relocate is only
+          used on XCOFF, which lacks psymtabs, and for gdb-stabs.h
+          targets.  */
+       p->textlow += ANOFFSET (delta, SECT_OFF_TEXT);
+       p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT);
+      }
+  }
+
+  {
+    struct partial_symbol *psym;
+
+    for (psym = objfile->global_psymbols.list;
+        psym < objfile->global_psymbols.next;
+        psym++)
+      if (SYMBOL_SECTION (psym) >= 0)
+       SYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, SYMBOL_SECTION (psym));
+    for (psym = objfile->static_psymbols.list;
+        psym < objfile->static_psymbols.next;
+        psym++)
+      if (SYMBOL_SECTION (psym) >= 0)
+       SYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, SYMBOL_SECTION (psym));
+  }
+
   {
     struct minimal_symbol *msym;
     ALL_OBJFILE_MSYMBOLS (objfile, msym)
-      SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
+      if (SYMBOL_SECTION (msym) >= 0)
+       SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
   }
 
   {
@@ -585,7 +641,7 @@ open_existing_mapped_file (symsfilename, mtime, mapped)
        {
          if (error_pre_print)
            {
-             printf (error_pre_print);
+             printf_unfiltered (error_pre_print);
            }
          print_sys_errmsg (symsfilename, errno);
        }
@@ -655,7 +711,7 @@ open_mapped_file (filename, mtime, mapped)
        {
          if (error_pre_print)
            {
-             printf (error_pre_print);
+             printf_unfiltered (error_pre_print);
            }
          print_sys_errmsg (symsfilename, errno);
        }
@@ -714,7 +770,7 @@ map_to_address ()
 
 /* Returns a section whose range includes PC or NULL if none found. */
 
-sec_ptr
+struct obj_section *
 find_pc_section(pc)
      CORE_ADDR pc;
 {
@@ -725,7 +781,7 @@ find_pc_section(pc)
     for (s = objfile->sections; s < objfile->sections_end; ++s)
       if (s->addr <= pc
          && pc < s->endaddr)
-       return(s->sec_ptr);
+       return(s);
 
   return(NULL);
 }
This page took 0.026974 seconds and 4 git commands to generate.