From 2093fe684049c2e47bcc438adbb39c308e4db840 Mon Sep 17 00:00:00 2001 From: "K. Richard Pixley" Date: Wed, 31 Mar 1993 00:29:22 +0000 Subject: 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. --- gdb/ChangeLog | 12 +++++ gdb/config/sparc/tm-sun4sol2.h | 3 ++ gdb/solib.h | 2 + gdb/sparc-tdep.c | 48 +++++++++++++---- gdb/symfile.c | 114 ++++++++++++++--------------------------- 5 files changed, 94 insertions(+), 85 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0c47a09..d423e55 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/config/sparc/tm-sun4sol2.h b/gdb/config/sparc/tm-sun4sol2.h index 638d33f..a95ef3b 100644 --- a/gdb/config/sparc/tm-sun4sol2.h +++ b/gdb/config/sparc/tm-sun4sol2.h @@ -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. */ diff --git a/gdb/solib.h b/gdb/solib.h index aba26d4..f11470b 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -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 */ diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index acb26dd..61af732 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -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 -#else -#include #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); +} + diff --git a/gdb/symfile.c b/gdb/symfile.c index 06bce27..d47a443 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -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 #include +#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); +} + void _initialize_symfile () -- cgit v1.1