These files removed.
[deliverable/binutils-gdb.git] / gdb / symfile.c
index a73f936feb95884da6b5aa6fd9c045bff4585605..cc515d585d7c22cc71eddcc6ac61daf244891204 100644 (file)
@@ -1,7 +1,7 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
 
    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
@@ -52,6 +52,7 @@
 #include "parser-defs.h"
 #include "varobj.h"
 #include "elf-bfd.h"
+#include "solib.h"
 
 #include <sys/types.h>
 #include <fcntl.h>
@@ -87,8 +88,6 @@ static int simple_read_overlay_region_table (void);
 static void simple_free_overlay_region_table (void);
 #endif
 
-static void set_initial_language (void);
-
 static void load_command (char *, int);
 
 static void symbol_file_add_main_1 (char *args, int from_tty, int flags);
@@ -536,8 +535,6 @@ place_section (bfd *abfd, asection *sect, void *obj)
 
   offsets[sect->index] = start_addr;
   arg->lowest = start_addr + bfd_get_section_size (sect);
-
-  exec_set_section_address (bfd_get_filename (abfd), sect->index, start_addr);
 }
 
 /* Parse the user's idea of an offset for dynamic linking, into our idea
@@ -636,6 +633,8 @@ default_symfile_offsets (struct objfile *objfile,
                continue;
 
              bfd_set_section_vma (abfd, cur_sec, offsets[cur_sec->index]);
+             exec_set_section_address (bfd_get_filename (abfd), cur_sec->index,
+                                       offsets[cur_sec->index]);
              offsets[cur_sec->index] = 0;
            }
        }
@@ -822,18 +821,13 @@ syms_from_objfile (struct objfile *objfile,
        bfd_map_over_sections (objfile->obfd, find_lowest_section,
                               &lower_sect);
       if (lower_sect == NULL)
-       warning (_("no loadable sections found in added symbol-file %s"),
-                objfile->name);
-      else
-       if ((bfd_get_section_flags (objfile->obfd, lower_sect) & SEC_CODE) == 0)
-         warning (_("Lowest section in %s is %s at %s"),
-                  objfile->name,
-                  bfd_section_name (objfile->obfd, lower_sect),
-                  paddr (bfd_section_vma (objfile->obfd, lower_sect)));
-      if (lower_sect != NULL)
-       lower_offset = bfd_section_vma (objfile->obfd, lower_sect);
+       {
+         warning (_("no loadable sections found in added symbol-file %s"),
+                  objfile->name);
+         lower_offset = 0;
+       }
       else
-       lower_offset = 0;
+       lower_offset = bfd_section_vma (objfile->obfd, lower_sect);
 
       /* Calculate offsets for the loadable sections.
         FIXME! Sections must be in order of increasing loadable section
@@ -1219,9 +1213,7 @@ symbol_file_clear (int from_tty)
        storage has just been released, we'd better wipe the solib
        descriptors as well.
      */
-#if defined(SOLIB_RESTART)
-    SOLIB_RESTART ();
-#endif
+    no_shared_libraries (NULL, from_tty);
 
     symfile_objfile = NULL;
     if (from_tty)
@@ -1576,7 +1568,7 @@ symbol_file_command (char *args, int from_tty)
    stabs we find, but we can't do that until later when we read in
    full symbols.  */
 
-static void
+void
 set_initial_language (void)
 {
   struct partial_symtab *pst;
@@ -2247,8 +2239,7 @@ add_symbol_file_command (char *args, int from_tty)
          entered on the command line. */
       section_addrs->other[sec_num].name = sec;
       section_addrs->other[sec_num].addr = addr;
-      printf_unfiltered ("\t%s_addr = %s\n",
-                      sec, hex_string ((unsigned long)addr));
+      printf_unfiltered ("\t%s_addr = %s\n", sec, paddress (addr));
       sec_num++;
 
       /* The object's sections are initialized when a
@@ -2340,6 +2331,14 @@ reread_symbols (void)
              /* We need to do this whenever any symbols go away.  */
              make_cleanup (clear_symtab_users_cleanup, 0 /*ignore*/);
 
+             if (exec_bfd != NULL && strcmp (bfd_get_filename (objfile->obfd),
+                                             bfd_get_filename (exec_bfd)) == 0)
+               {
+                 /* Reload EXEC_BFD without asking anything.  */
+
+                 exec_file_attach (bfd_get_filename (objfile->obfd), 0);
+               }
+
              /* Clean up any state BFD has sitting around.  We don't need
                 to close the descriptor but BFD lacks a way of closing the
                 BFD without closing the descriptor.  */
@@ -2405,7 +2404,6 @@ reread_symbols (void)
                      sizeof (objfile->msymbol_hash));
              memset (&objfile->msymbol_demangled_hash, 0,
                      sizeof (objfile->msymbol_demangled_hash));
-             objfile->fundamental_types = NULL;
              clear_objfile_data (objfile);
              if (objfile->sf != NULL)
                {
@@ -2688,6 +2686,7 @@ init_filename_language_table (void)
       add_filename_language (".f", language_fortran);
       add_filename_language (".F", language_fortran);
       add_filename_language (".s", language_asm);
+      add_filename_language (".sx", language_asm);
       add_filename_language (".S", language_asm);
       add_filename_language (".pas", language_pascal);
       add_filename_language (".p", language_pascal);
@@ -3517,13 +3516,13 @@ list_overlays_command (char *args, int from_tty)
        name = bfd_section_name (objfile->obfd, osect->the_bfd_section);
 
        printf_filtered ("Section %s, loaded at ", name);
-       deprecated_print_address_numeric (lma, 1, gdb_stdout);
+       fputs_filtered (paddress (lma), gdb_stdout);
        puts_filtered (" - ");
-       deprecated_print_address_numeric (lma + size, 1, gdb_stdout);
+       fputs_filtered (paddress (lma + size), gdb_stdout);
        printf_filtered (", mapped at ");
-       deprecated_print_address_numeric (vma, 1, gdb_stdout);
+       fputs_filtered (paddress (vma), gdb_stdout);
        puts_filtered (" - ");
-       deprecated_print_address_numeric (vma + size, 1, gdb_stdout);
+       fputs_filtered (paddress (vma + size), gdb_stdout);
        puts_filtered ("\n");
 
        nmapped++;
@@ -3987,6 +3986,22 @@ free_symfile_segment_data (struct symfile_segment_data *data)
   xfree (data);
 }
 
+
+/* Given:
+   - DATA, containing segment addresses from the object file ABFD, and
+     the mapping from ABFD's sections onto the segments that own them,
+     and
+   - SEGMENT_BASES[0 .. NUM_SEGMENT_BASES - 1], holding the actual
+     segment addresses reported by the target,
+   store the appropriate offsets for each section in OFFSETS.
+
+   If there are fewer entries in SEGMENT_BASES than there are segments
+   in DATA, then apply SEGMENT_BASES' last entry to all the segments.
+
+   If there are more, then verify that all the excess addresses are
+   the same as the last legitimate one, and then ignore them.  This
+   allows "TextSeg=X;DataSeg=X" qOffset replies for files which have
+   only a single segment.  */
 int
 symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
                                 struct section_offsets *offsets,
@@ -3996,15 +4011,16 @@ symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
   int i;
   asection *sect;
 
+  /* It doesn't make sense to call this function unless you have some
+     segment base addresses.  */
+  gdb_assert (segment_bases > 0);
+
   /* If we do not have segment mappings for the object file, we
      can not relocate it by segments.  */
   gdb_assert (data != NULL);
   gdb_assert (data->num_segments > 0);
 
-  /* If more offsets are provided than we have segments, make sure the
-     excess offsets are all the same as the last segment's offset.
-     This allows "Text=X;Data=X" for files which have only a single
-     segment.  */
+  /* Check any extra SEGMENT_BASES entries.  */
   if (num_segment_bases > data->num_segments)
     for (i = data->num_segments; i < num_segment_bases; i++)
       if (segment_bases[i] != segment_bases[data->num_segments - 1])
@@ -4012,17 +4028,22 @@ symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
 
   for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next)
     {
-      CORE_ADDR vma;
       int which = data->segment_info[i];
 
+      gdb_assert (0 <= which && which <= data->num_segments);
+
+      /* Don't bother computing offsets for sections that aren't
+         loaded as part of any segment.  */
+      if (! which)
+        continue;
+
+      /* Use the last SEGMENT_BASES entry as the address of any extra
+         segments mentioned in DATA->segment_info.  */
       if (which > num_segment_bases)
-       offsets->offsets[i] = segment_bases[num_segment_bases - 1];
-      else if (which > 0)
-       offsets->offsets[i] = segment_bases[which - 1];
-      else
-       continue;
+        which = num_segment_bases;
 
-      offsets->offsets[i] -= data->segment_bases[which - 1];
+      offsets->offsets[i] = (segment_bases[which - 1]
+                             - data->segment_bases[which - 1]);
     }
 
   return 1;
This page took 0.026099 seconds and 4 git commands to generate.