Teach sparc solaris to next over shared library functions.
authorK. Richard Pixley <rich@cygnus>
Wed, 31 Mar 1993 00:29:22 +0000 (00:29 +0000)
committerK. Richard Pixley <rich@cygnus>
Wed, 31 Mar 1993 00:29:22 +0000 (00:29 +0000)
* solib.[hc] (find_pc_section_from_so_list): new function and
  prototype.
* sparc-tdep.c (in_solib_trampoline): new function.
* symfile.[hc] (find_pc_section): new function and prototypes.
* target.[hc] (find_pc_section_from_targets): new function and
  prototypes.
* config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): redefine to
  in_solib_trampoline.

gdb/ChangeLog
gdb/config/sparc/tm-sun4sol2.h
gdb/solib.h
gdb/sparc-tdep.c
gdb/symfile.c

index 0c47a097387d2f0f86f65e45ec28f8bd54a774cb..d423e55634c4a2a7e69693457175433064c2f713 100644 (file)
@@ -1,3 +1,15 @@
+Tue Mar 30 15:46:14 1993  K. Richard Pixley  (rich@rtl.cygnus.com)
+
+       Teach sparc solaris to next over shared library functions.
+       * solib.[hc] (find_pc_section_from_so_list): new function and
+         prototype.
+       * sparc-tdep.c (in_solib_trampoline): new function.
+       * symfile.[hc] (find_pc_section): new function and prototypes.
+       * target.[hc] (find_pc_section_from_targets): new function and
+         prototypes.
+       * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): redefine to
+         in_solib_trampoline.
+
 Tue Mar 30 08:06:24 1993  Jim Kingdon  (kingdon@cygnus.com)
 
        * infrun.c (wait_for_inferior): Revise comment.
index 638d33faf7030d9f6bd5ea25b7474c167744dcc5..a95ef3bd6b0eee265294a28f4c503816cef786ad 100644 (file)
@@ -20,6 +20,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "sparc/tm-sparc.h"
 #include "tm-sysv4.h"
 
+#undef IN_SOLIB_TRAMPOLINE
+#define IN_SOLIB_TRAMPOLINE(pc, name)  in_solib_trampoline((pc), (name))
+
 /* The values of N_SLINE, N_LBRAC, N_RBRAC symbols in .stab sections are
    relative to the current function, rather than being absolute or
    relative to the current N_SO.  */
index aba26d455891072c19cb23731955fbee703c1395..f11470bd5223f557972b68d386daa0d4d8904164 100644 (file)
@@ -55,3 +55,5 @@ solib_create_inferior_hook PARAMS((void));    /* solib.c */
 extern int
 solib_address PARAMS ((CORE_ADDR));            /* solib.c */
 
+struct section_table *
+find_pc_section_from_so_list PARAMS ((CORE_ADDR pc)); /* solib.c */
index acb26dd546c1b98821a03aec6955105dc4997610..61af732ad41523e8e08b4ae466881b7ae251bf16 100644 (file)
@@ -1,5 +1,5 @@
 /* Target-dependent code for the SPARC for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -23,11 +23,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #include "target.h"
 #include "ieee-float.h"
+#include "symfile.h" /* for find_pc_section */
 
 #ifdef USE_PROC_FS
 #include <sys/procfs.h>
-#else
-#include <sys/ptrace.h>
 #endif
 
 #include "gdbcore.h"
@@ -191,15 +190,21 @@ frame_saved_pc (frame)
  * difficulty. 
  */
 FRAME
-setup_arbitrary_frame (frame, stack)
-     FRAME_ADDR frame, stack;
+setup_arbitrary_frame (argc, argv)
+     int argc;
+     FRAME_ADDR *argv;
 {
-  FRAME fid = create_new_frame (frame, 0);
+  FRAME fid;
+
+  if (argc != 2)
+    error ("Sparc frame specifications require two arguments: fp and sp");
+
+  fid = create_new_frame (argv[0], 0);
 
   if (!fid)
     fatal ("internal: create_new_frame returned invalid frame id");
   
-  fid->bottom = stack;
+  fid->bottom = argv[1];
   fid->pc = FRAME_SAVED_PC (fid);
   return fid;
 }
@@ -228,7 +233,7 @@ setup_arbitrary_frame (frame, stack)
  * original contents of g1.  A * indicates that the actual value of
  * the instruction is modified below.
  */
-static int save_insn_opcodes[] = {
+static unsigned int save_insn_opcodes[] = {
   0x03000000, 0x82007ee0, 0x9de38001, 0x03000000,
   0x82007ee0, 0x91d02001, 0x01000000 };
 
@@ -279,7 +284,8 @@ do_save_insn (size)
        t %g0,1
        sethi %hi(0),%g0        */
 
-static int restore_insn_opcodes[] = { 0x81e80000, 0x91d02001, 0x01000000 };
+static unsigned int restore_insn_opcodes[] = {
+  0x81e80000, 0x91d02001, 0x01000000 };
 
 static void
 do_restore_insn ()
@@ -831,3 +837,27 @@ get_longjmp_target(pc)
   return 1;
 }
 #endif /* GET_LONGJMP_TARGET */
+
+/* So far used only for sparc solaris.  In sparc solaris, we recognize
+   a trampoline by it's section name.  That is, if the pc is in a
+   section named ".plt" then we are in a trampline.
+
+   Section and offset tracking belongs in objfiles.  FIXME. */
+
+int
+in_solib_trampoline(pc, name)
+     CORE_ADDR pc;
+     char *name;
+{
+  struct section_table *s;
+  int retval = 0;
+  
+  s = find_pc_section(pc);
+  
+  retval = (s != NULL
+           && s->sec_ptr != NULL
+           && s->sec_ptr->name != NULL
+           && STREQ (s->sec_ptr->name, ".plt"));
+  return(retval);
+}
+
index 06bce27a034906cdc7d01f199f9938537cee7c29..d47a443f74e1af1b9c5dfe401afc9bd2be8edaba 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
-   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
 This file is part of GDB.
@@ -42,6 +42,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/stat.h>
 #include <ctype.h>
 
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
 /* Global variables owned by this file */
 
 int readnow_symbol_files;              /* Read full symbols immediately */
@@ -375,21 +379,6 @@ syms_from_objfile (objfile, addr, mainline, verbo)
   struct section_offsets *section_offsets;
   asection *lowest_sect;
 
-  /* There is a distinction between having no symbol table
-     (we refuse to read the file, leaving the old set of symbols around)
-     and having no debugging symbols in your symbol table (we read
-     the file and end up with a mostly empty symbol table).
-
-     FIXME:  This strategy works correctly when the debugging symbols are
-     intermixed with "normal" symbols.  However, when the debugging symbols
-     are separate, such as with ELF/DWARF, it is perfectly plausible for
-     the symbol table to be missing but still have all the DWARF info
-     intact.  Thus in general it is wrong to assume that having no symbol
-     table implies no debugging information. */
-
-  if (!(bfd_get_file_flags (objfile -> obfd) & HAS_SYMS))
-    return;
-
   init_entry_point_info (objfile);
   find_sym_fns (objfile);
 
@@ -440,48 +429,19 @@ syms_from_objfile (objfile, addr, mainline, verbo)
        addr -= bfd_section_vma (objfile->obfd, lowest_sect);
     }
 
-  {
-  /* Debugging check inserted for testing elimination of NAMES_HAVE_UNDERSCORE.
-     Complain if the dynamic setting of NAMES_HAVE_UNDERSCORE from BFD
-     doesn't match the static setting from the GDB config files, but only
-     if we are using the first BFD target (the default target selected by
-     the same configuration that decided whether NAMES_HAVE_UNDERSCORE is
-     defined or not).  For other targets (such as when the user sets GNUTARGET
-     or we are reading a "foreign" object file), it is likely that the value
-     of bfd_get_symbol_leading_char has no relation to the value of
-     NAMES_HAVE_UNDERSCORE for the target for which this gdb was built.
-     Hack alert: the only way to currently do this with bfd is to ask it to
-     produce a list of known target names and compare the first one in the
-     list with the one for the bfd we are using.
-     FIXME:  Remove this check after a round of testing.  
-                                               -- gnu@cygnus.com, 16dec92 */
-    CONST char **targets = bfd_target_list ();
-    if (targets != NULL && *targets != NULL)
-      {
-       if (bfd_get_symbol_leading_char (objfile->obfd) !=
-#ifdef NAMES_HAVE_UNDERSCORE
-           '_'
-#else
-           0
-#endif
-           && STREQ (bfd_get_target (objfile->obfd), *targets))
-         {
-           fprintf (stderr, "GDB internal error!  NAMES_HAVE_UNDERSCORE set wrong for %s BFD:\n%s\n",
-                    bfd_get_target (objfile->obfd),
-                    bfd_get_filename (objfile->obfd));
-         }
-       free (targets);
-      }
-    /* End of debugging check.  FIXME.  */
-  }
-
   /* Initialize symbol reading routines for this objfile, allow complaints to
      appear for this new file, and record how verbose to be, then do the
      initial symbol reading for this file. */
 
   (*objfile -> sf -> sym_init) (objfile);
   clear_complaints (1, verbo);
+
+  /* If objfile->sf->sym_offsets doesn't set this, we don't care
+     (currently).  */
+  objfile->num_sections = 0;  /* krp-FIXME: why zero? */
   section_offsets = (*objfile -> sf -> sym_offsets) (objfile, addr);
+  objfile->section_offsets = section_offsets;
+
   (*objfile -> sf -> sym_read) (objfile, section_offsets, mainline);
 
   /* Don't allow char * to have a typename (else would get caddr_t.)  */
@@ -550,26 +510,10 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
   struct partial_symtab *psymtab;
   bfd *abfd;
 
-  /* Open a bfd for the file and then check to see if the file has a
-     symbol table.  There is a distinction between having no symbol table
-     (we refuse to read the file, leaving the old set of symbols around)
-     and having no debugging symbols in the symbol table (we read the file
-     and end up with a mostly empty symbol table, but with lots of stuff in
-     the minimal symbol table).  We need to make the decision about whether
-     to continue with the file before allocating and building a objfile.
-
-     FIXME:  This strategy works correctly when the debugging symbols are
-     intermixed with "normal" symbols.  However, when the debugging symbols
-     are separate, such as with ELF/DWARF, it is perfectly plausible for
-     the symbol table to be missing but still have all the DWARF info
-     intact.  Thus in general it is wrong to assume that having no symbol
-     table implies no debugging information. */
+  /* Open a bfd for the file, and give user a chance to burp if we'd be
+     interactively wiping out any existing symbols.  */
 
   abfd = symfile_bfd_open (name);
-  if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
-    {
-      error ("%s has no symbol-table", name);
-    }
 
   if ((have_full_symbols () || have_partial_symbols ())
       && mainline
@@ -771,7 +715,7 @@ symfile_bfd_open (name)
   name = tilde_expand (name);  /* Returns 1st new malloc'd copy */
 
   /* Look down path for it, allocate 2nd new malloc'd copy.  */
-  desc = openp (getenv ("PATH"), 1, name, O_RDONLY, 0, &absolute_name);
+  desc = openp (getenv ("PATH"), 1, name, O_RDONLY | O_BINARY, 0, &absolute_name);
   if (desc < 0)
     {
       make_cleanup (free, name);
@@ -986,18 +930,21 @@ enum language
 deduce_language_from_filename (filename)
      char *filename;
 {
-  char *c = strrchr (filename, '.');
+  char *c;
   
-  if (!c) ; /* Get default. */
+  if (0 == filename) 
+    ; /* Get default */
+  else if (0 == (c = strrchr (filename, '.')))
+    ; /* Get default. */
   else if(STREQ(c,".mod"))
-     return language_m2;
+    return language_m2;
   else if(STREQ(c,".c"))
-     return language_c;
+    return language_c;
   else if(STREQ(c,".cc") || STREQ(c,".C"))
-     return language_cplus;
+    return language_cplus;
   /* start-sanitize-chill */
   else if(STREQ(c,".ch") || STREQ(c,".c186") || STREQ(c,".c286"))
-     return language_chill;
+    return language_chill;
   /* end-sanitize-chill */
 
   return language_unknown;             /* default */
@@ -1384,6 +1331,21 @@ add_psymbol_addr_to_list (name, namelength, namespace, class, list, val,
 
 #endif /* !INLINE_ADD_PSYMBOL */
 
+/* Returns a section whose range includes PC or NULL if none found. */
+
+struct section_table *
+find_pc_section(pc)
+     CORE_ADDR pc;
+{
+  struct section_table *s;
+
+  s = find_pc_section_from_targets(pc);
+  if (s == NULL)
+    s = find_pc_section_from_so_list(pc);
+
+  return(s);
+}
+
 \f
 void
 _initialize_symfile ()