* mdebugread.c (parse_symbol): Use new variable
[deliverable/binutils-gdb.git] / gdb / symfile.c
index fd8298dde766cef9d4c5657b01b657ffbb1d151c..24e7c6e3f625b667288bf18292c9dfc77787fc79 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
-   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
 This file is part of GDB.
@@ -48,7 +48,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
 
 /* Global variables owned by this file */
-
 int readnow_symbol_files;              /* Read full symbols immediately */
 
 struct complaint oldsyms_complaint = {
@@ -74,6 +73,9 @@ load_command PARAMS ((char *, int));
 static void
 add_symbol_file_command PARAMS ((char *, int));
 
+static void
+add_shared_symbol_files_command PARAMS ((char *, int));
+
 static void
 cashier_psymtab PARAMS ((struct partial_symtab *));
 
@@ -295,11 +297,9 @@ init_entry_point_info (objfile)
   else
     {
       /* Examination of non-executable.o files.  Short-circuit this stuff.  */
-      /* ~0 will not be in any file, we hope.  */
-      objfile -> ei.entry_point = ~0;
-      /* set the startup file to be an empty range.  */
-      objfile -> ei.entry_file_lowpc = 0;
-      objfile -> ei.entry_file_highpc = 0;
+      objfile -> ei.entry_point = INVALID_ENTRY_POINT;
+      objfile -> ei.entry_file_lowpc = INVALID_ENTRY_LOWPC;
+      objfile -> ei.entry_file_highpc = INVALID_ENTRY_HIGHPC;
     }
 }
 
@@ -409,6 +409,7 @@ syms_from_objfile (objfile, addr, mainline, verbo)
       else if (0 == bfd_get_section_name (objfile->obfd, lowest_sect)
               || !STREQ (".text",
                              bfd_get_section_name (objfile->obfd, lowest_sect)))
+       /* FIXME-32x64--assumes bfd_vma fits in long.  */
        warning ("Lowest section in %s is %s at 0x%lx",
                 objfile->name,
                 bfd_section_name (objfile->obfd, lowest_sect),
@@ -464,6 +465,13 @@ syms_from_objfile (objfile, addr, mainline, verbo)
 
   (*objfile -> sf -> sym_read) (objfile, section_offsets, mainline);
 
+  if (!have_partial_symbols () && !have_full_symbols ())
+    {
+      wrap_here ("");
+      printf_filtered ("(no debugging symbols found)...");
+      wrap_here ("");
+    }
+
   /* Don't allow char * to have a typename (else would get caddr_t).
      Ditto void *.  FIXME: Check whether this is now done by all the
      symbol readers themselves (many of them now do), and if so remove
@@ -564,7 +572,7 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
        {
          printf_filtered ("Mapped symbols for %s...", name);
          wrap_here ("");
-         fflush (stdout);
+         gdb_flush (gdb_stdout);
        }
       init_entry_point_info (objfile);
       find_sym_fns (objfile);
@@ -578,7 +586,7 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
        {
          printf_filtered ("Reading symbols from %s...", name);
          wrap_here ("");
-         fflush (stdout);
+         gdb_flush (gdb_stdout);
        }
       syms_from_objfile (objfile, addr, mainline, from_tty);
     }      
@@ -594,7 +602,7 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
        {
          printf_filtered ("expanding to full symbols...");
          wrap_here ("");
-         fflush (stdout);
+         gdb_flush (gdb_stdout);
        }
 
       for (psymtab = objfile -> psymtabs;
@@ -608,21 +616,23 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
   if (from_tty || info_verbose)
     {
       printf_filtered ("done.\n");
-      fflush (stdout);
+      gdb_flush (gdb_stdout);
     }
 
   new_symfile_objfile (objfile, mainline, from_tty);
-      
-  /* Getting new symbols may change our opinion about what is
-     frameless.  */
-
-  reinit_frame_cache ();
 
   return (objfile);
 }
 
-/* This is the symbol-file command.  Read the file, analyze its symbols,
-   and add a struct symtab to a symtab list.  */
+/* This is the symbol-file command.  Read the file, analyze its
+   symbols, and add a struct symtab to a symtab list.  The syntax of
+   the command is rather bizarre--(1) buildargv implements various
+   quoting conventions which are undocumented and have little or
+   nothing in common with the way things are quoted (or not quoted)
+   elsewhere in GDB, (2) options are used, which are not generally
+   used in GDB (perhaps "set mapped on", "set readnow on" would be
+   better), (3) the order of options matters, which is contrary to GNU
+   conventions (because it is confusing and inconvenient).  */
 
 void
 symbol_file_command (args, from_tty)
@@ -631,6 +641,7 @@ symbol_file_command (args, from_tty)
 {
   char **argv;
   char *name = NULL;
+  CORE_ADDR text_relocation = 0;               /* text_relocation */
   struct cleanup *cleanups;
   int mapped = 0;
   int readnow = 0;
@@ -648,7 +659,7 @@ symbol_file_command (args, from_tty)
       symfile_objfile = NULL;
       if (from_tty)
        {
-         printf ("No symbol file now.\n");
+         printf_unfiltered ("No symbol file now.\n");
        }
     }
   else
@@ -674,7 +685,32 @@ symbol_file_command (args, from_tty)
            }
          else
            {
-             name = *argv;
+            char *p;
+
+              name = *argv;
+
+              /* this is for rombug remote only, to get the text relocation by
+              using link command */
+              p = strrchr(name, '/');
+              if (p != NULL) p++;
+              else p = name;
+
+              target_link(p, &text_relocation);
+
+              if (text_relocation == (CORE_ADDR)0)
+                return;
+              else if (text_relocation == (CORE_ADDR)-1)
+                symbol_file_add (name, from_tty, (CORE_ADDR)0, 1, mapped,
+                                readnow);
+              else
+                symbol_file_add (name, from_tty, (CORE_ADDR)text_relocation,
+                                0, mapped, readnow);
+
+             /* Getting new symbols may change our opinion about what is
+                frameless.  */
+             reinit_frame_cache ();
+
+              set_initial_language ();
            }
          argv++;
        }
@@ -683,11 +719,6 @@ symbol_file_command (args, from_tty)
        {
          error ("no symbol file name was specified");
        }
-      else
-       {
-         symbol_file_add (name, from_tty, (CORE_ADDR)0, 1, mapped, readnow);
-         set_initial_language ();
-       }
       do_cleanups (cleanups);
     }
 }
@@ -757,7 +788,7 @@ symfile_bfd_open (name)
       close (desc);
       make_cleanup (free, name);
       error ("\"%s\": can't open to read symbols: %s.", name,
-            bfd_errmsg (bfd_error));
+            bfd_errmsg (bfd_get_error ()));
     }
   sym_bfd->cacheable = true;
 
@@ -766,7 +797,7 @@ symfile_bfd_open (name)
       bfd_close (sym_bfd);     /* This also closes desc */
       make_cleanup (free, name);
       error ("\"%s\": can't read symbols: %s.", name,
-            bfd_errmsg (bfd_error));
+            bfd_errmsg (bfd_get_error ()));
     }
 
   return (sym_bfd);
@@ -797,11 +828,16 @@ find_sym_fns (objfile)
 {
   struct sym_fns *sf;
   enum bfd_flavour our_flavour = bfd_get_flavour (objfile -> obfd);
+  char *our_target = bfd_get_target (objfile -> obfd);
 
   /* Special kludge for RS/6000.  See xcoffread.c.  */
-  if (STREQ (bfd_get_target (objfile -> obfd), "aixcoff-rs6000"))
+  if (STREQ (our_target, "aixcoff-rs6000"))
     our_flavour = (enum bfd_flavour)-1;
 
+  /* Special kludge for apollo.  See dstread.c.  */
+  if (STREQN (our_target, "apollo", 6))
+    our_flavour = (enum bfd_flavour)-2;
+
   for (sf = symtab_fns; sf != NULL; sf = sf -> next)
     {
       if (our_flavour == sf -> sym_flavour)
@@ -821,6 +857,8 @@ load_command (arg, from_tty)
      char *arg;
      int from_tty;
 {
+  if (arg == NULL)
+    arg = get_exec_file (1);
   target_load (arg, from_tty);
 }
 
@@ -839,7 +877,9 @@ generic_load (filename, from_tty)
 {
   struct cleanup *old_cleanups;
   asection *s;
-  bfd *loadfile_bfd = bfd_openr (filename, gnutarget);
+  bfd *loadfile_bfd;
+
+  loadfile_bfd = bfd_openr (filename, gnutarget);
   if (loadfile_bfd == NULL)
     {
       perror_with_name (filename);
@@ -850,7 +890,7 @@ generic_load (filename, from_tty)
   if (!bfd_check_format (loadfile_bfd, bfd_object)) 
     {
       error ("\"%s\" is not an object file: %s", filename,
-            bfd_errmsg (bfd_error));
+            bfd_errmsg (bfd_get_error ()));
     }
   
   for (s = loadfile_bfd->sections; s; s = s->next) 
@@ -873,9 +913,11 @@ generic_load (filename, from_tty)
 
              /* Is this really necessary?  I guess it gives the user something
                 to look at during a long download.  */
-             printf_filtered ("Loading section %s, size 0x%lx vma 0x%lx\n",
+             printf_filtered ("Loading section %s, size 0x%lx vma ",
                               bfd_get_section_name (loadfile_bfd, s),
-                              (unsigned long) size, (unsigned long) vma);
+                              (unsigned long) size);
+             print_address_numeric (vma, 1, gdb_stdout);
+             printf_filtered ("\n");
 
              bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size);
 
@@ -959,20 +1001,46 @@ add_symbol_file_command (args, from_tty)
      left pointing at the remainder of the command line, which should
      be the address expression to evaluate. */
 
-  if ((name == NULL) || (*args == '\000') )
+  if (name == NULL)
     {
-      error ("add-symbol-file takes a file name and an address");
+      error ("add-symbol-file takes a file name");
     }
   name = tilde_expand (name);
   make_cleanup (free, name);
 
-  text_addr = parse_and_eval_address (args);
+  if (*args != '\000')
+    {
+      text_addr = parse_and_eval_address (args);
+    }
+  else
+    {
+      target_link(name, &text_addr);
+      if (text_addr == (CORE_ADDR)-1)
+       error("Don't know how to get text start location for this file");
+    }
 
+  /* FIXME-32x64: Assumes text_addr fits in a long.  */
   if (!query ("add symbol table from file \"%s\" at text_addr = %s?\n",
              name, local_hex_string ((unsigned long)text_addr)))
     error ("Not confirmed.");
 
   symbol_file_add (name, 0, text_addr, 0, mapped, readnow);
+
+  /* Getting new symbols may change our opinion about what is
+     frameless.  */
+  reinit_frame_cache ();
+}
+\f
+static void
+add_shared_symbol_files_command  (args, from_tty)
+     char *args;
+     int from_tty;
+{
+#ifdef ADD_SHARED_SYMBOL_FILES
+  ADD_SHARED_SYMBOL_FILES (args, from_tty);
+#else
+  error ("This command is not available in this configuration of GDB.");
+#endif  
 }
 \f
 /* Re-read symbols if a symbol-file has changed.  */
@@ -1015,6 +1083,7 @@ reread_symbols ()
          struct section_offsets *offsets;
          int num_offsets;
          int section_offsets_size;
+         char *obfd_filename;
 
          printf_filtered ("`%s' has changed; re-reading symbols.\n",
                           objfile->name);
@@ -1036,15 +1105,16 @@ reread_symbols ()
          /* 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.  */
+         obfd_filename = bfd_get_filename (objfile->obfd);
          if (!bfd_close (objfile->obfd))
            error ("Can't close BFD for %s.", objfile->name);
-         objfile->obfd = bfd_openr (objfile->name, gnutarget);
+         objfile->obfd = bfd_openr (obfd_filename, gnutarget);
          if (objfile->obfd == NULL)
            error ("Can't open %s to read symbols.", objfile->name);
          /* bfd_openr sets cacheable to true, which is what we want.  */
          if (!bfd_check_format (objfile->obfd, bfd_object))
            error ("Can't read symbols from %s: %s.", objfile->name,
-                  bfd_errmsg (bfd_error));
+                  bfd_errmsg (bfd_get_error ()));
 
          /* Save the offsets, we will nuke them with the rest of the
             psymbol_obstack.  */
@@ -1064,10 +1134,12 @@ reread_symbols ()
          if (objfile->global_psymbols.list)
            mfree (objfile->md, objfile->global_psymbols.list);
          objfile->global_psymbols.list = NULL;
+         objfile->global_psymbols.next = NULL;
          objfile->global_psymbols.size = 0;
          if (objfile->static_psymbols.list)
            mfree (objfile->md, objfile->static_psymbols.list);
          objfile->static_psymbols.list = NULL;
+         objfile->static_psymbols.next = NULL;
          objfile->static_psymbols.size = 0;
 
          /* Free the obstacks for non-reusable objfiles */
@@ -1099,7 +1171,7 @@ reread_symbols ()
          if (build_objfile_section_table (objfile))
            {
              error ("Can't find the file sections in `%s': %s", 
-                    objfile -> name, bfd_errmsg (bfd_error));
+                    objfile -> name, bfd_errmsg (bfd_get_error ()));
            }
 
          /* We use the same section offsets as from last time.  I'm not
@@ -1121,6 +1193,12 @@ reread_symbols ()
             zero is OK since dbxread.c also does what it needs to do if
             objfile->global_psymbols.size is 0.  */
          (*objfile->sf->sym_read) (objfile, objfile->section_offsets, 0);
+         if (!have_partial_symbols () && !have_full_symbols ())
+           {
+             wrap_here ("");
+             printf_filtered ("(no debugging symbols found)\n");
+             wrap_here ("");
+           }
          objfile -> flags |= OBJF_SYMS;
 
          /* We're done reading the symbol file; finish off complaints.  */
@@ -1158,14 +1236,19 @@ deduce_language_from_filename (filename)
     ; /* Get default */
   else if (0 == (c = strrchr (filename, '.')))
     ; /* Get default. */
-  else if (STREQ(c,".mod"))
-    return language_m2;
-  else if (STREQ(c,".c"))
+  else if (STREQ (c, ".c"))
     return language_c;
-  else if (STREQ (c,".cc") || STREQ (c,".C") || STREQ (c, ".cxx"))
+  else if (STREQ (c, ".cc") || STREQ (c, ".C") || STREQ (c, ".cxx")
+          || STREQ (c, ".cpp") || STREQ (c, ".cp"))
     return language_cplus;
-  else if (STREQ (c,".ch") || STREQ (c,".c186") || STREQ (c,".c286"))
+  else if (STREQ (c, ".ch") || STREQ (c, ".c186") || STREQ (c, ".c286"))
     return language_chill;
+  else if (STREQ (c, ".f") || STREQ (c, ".F"))
+    return language_fortran;
+  else if (STREQ (c, ".mod"))
+    return language_m2;
+  else if (STREQ (c, ".s") || STREQ (c, ".S"))
+    return language_asm;
 
   return language_unknown;             /* default */
 }
@@ -1528,7 +1611,7 @@ add_psymbol_to_list (name, namelength, namespace, class, list, val, language,
   SYMBOL_LANGUAGE (psym) = language;
   PSYMBOL_NAMESPACE (psym) = namespace;
   PSYMBOL_CLASS (psym) = class;
-  SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
+  SYMBOL_INIT_LANGUAGE_SPECIFIC (psym, language);
 }
 
 /* Add a symbol with a CORE_ADDR value to a psymtab. */
@@ -1562,7 +1645,7 @@ add_psymbol_addr_to_list (name, namelength, namespace, class, list, val,
   SYMBOL_LANGUAGE (psym) = language;
   PSYMBOL_NAMESPACE (psym) = namespace;
   PSYMBOL_CLASS (psym) = class;
-  SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
+  SYMBOL_INIT_LANGUAGE_SPECIFIC (psym, language);
 }
 
 #endif /* !INLINE_ADD_PSYMBOL */
@@ -1580,11 +1663,19 @@ to execute.", &cmdlist);
   c->completer = filename_completer;
 
   c = add_cmd ("add-symbol-file", class_files, add_symbol_file_command,
-   "Load the symbols from FILE, assuming FILE has been dynamically loaded.\n\
-The second argument provides the starting address of the file's text.",
+   "Usage: add-symbol-file FILE ADDR\n\
+Load the symbols from FILE, assuming FILE has been dynamically loaded.\n\
+ADDR is the starting address of the file's text.",
               &cmdlist);
   c->completer = filename_completer;
 
+  c = add_cmd ("add-shared-symbol-files", class_files,
+              add_shared_symbol_files_command,
+   "Load the symbols from shared objects in the dynamic linker's link map.",
+              &cmdlist);
+  c = add_alias_cmd ("assf", "add-shared-symbol-files", class_files, 1,
+                    &cmdlist);
+
   c = add_cmd ("load", class_files, load_command,
    "Dynamically load FILE into the running program, and record its symbols\n\
 for access from GDB.", &cmdlist);
This page took 0.02891 seconds and 4 git commands to generate.