* breakpoint.c, breakpoint.h (breakpoint_init_inferior): New function
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index 7fb53e7ef31ea2bc7dd3edf9bd0db491d3fa06c2..b111f005c05db44fa2d7c6c87fa2180ba355c0b7 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>
@@ -60,6 +62,53 @@ struct objfile *symfile_objfile;     /* Main symbol table loaded from */
 
 int mapped_symbol_files;               /* Try to use mapped symbol files */
 
+/* Locate all mappable sections of a BFD file. 
+   objfile_p_char is a char * to get it through
+   bfd_map_over_sections; we cast it back to its proper type.  */
+
+static void
+add_to_objfile_sections (abfd, asect, objfile_p_char)
+     bfd *abfd;
+     sec_ptr asect;
+     PTR objfile_p_char;
+{
+  struct objfile *objfile = (struct objfile *) objfile_p_char;
+  struct obj_section section;
+  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))
+    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 *) (((unsigned long) objfile->sections_end) + 1);
+}
+
+/* Builds a section table for OBJFILE.
+   Returns 0 if OK, 1 on error.  */
+
+static int
+build_objfile_section_table (objfile)
+     struct objfile *objfile;
+{
+  if (objfile->sections)
+    abort();
+
+  objfile->sections_end = 0;
+  bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *)objfile);
+  objfile->sections = (struct obj_section *)
+    obstack_finish (&objfile->psymbol_obstack);
+  objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
+  return(0);
+}
+
 /* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
    whether or not an objfile is to be mapped (MAPPED), allocate a new objfile
    struct, fill it in as best we can, link it into the list of all known
@@ -72,7 +121,7 @@ allocate_objfile (abfd, mapped)
 {
   struct objfile *objfile = NULL;
   int fd;
-  void *md;
+  PTR md;
   CORE_ADDR mapto;
 
   mapped |= mapped_symbol_files;
@@ -93,7 +142,7 @@ allocate_objfile (abfd, mapped)
   if (fd >= 0)
     {
       if (((mapto = map_to_address ()) == 0) ||
-         ((md = mmalloc_attach (fd, (void *) mapto)) == NULL))
+         ((md = mmalloc_attach (fd, (PTR) mapto)) == NULL))
        {
          close (fd);
        }
@@ -188,6 +237,14 @@ allocate_objfile (abfd, mapped)
   objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
   objfile -> mtime = bfd_get_mtime (abfd);
 
+  /* Build section table.  */
+
+  if (build_objfile_section_table (objfile))
+    {
+      error ("Can't find the file sections in `%s': %s", 
+            objfile -> name, bfd_errmsg (bfd_error));
+    }
+
   /* Push this file onto the head of the linked list of other such files. */
 
   objfile -> next = object_files;
@@ -281,9 +338,16 @@ 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
   clear_pc_function_cache ();
 
@@ -329,7 +393,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 ()
@@ -340,6 +404,7 @@ free_all_objfiles ()
     {
       free_objfile (objfile);
     }
+  clear_symtab_users ();
 }
 \f
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
@@ -418,10 +483,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));
   }
 
   {
@@ -658,3 +753,21 @@ map_to_address ()
 }
 
 #endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
+
+/* Returns a section whose range includes PC or NULL if none found. */
+
+struct obj_section *
+find_pc_section(pc)
+     CORE_ADDR pc;
+{
+  struct obj_section *s;
+  struct objfile *objfile;
+  
+  ALL_OBJFILES (objfile)
+    for (s = objfile->sections; s < objfile->sections_end; ++s)
+      if (s->addr <= pc
+         && pc < s->endaddr)
+       return(s);
+
+  return(NULL);
+}
This page took 0.024507 seconds and 4 git commands to generate.