Changes by Peter.Schauer to fix gdb/13521 -- gdb step command fails to step
authorDavid Taylor <taylor@redhat.com>
Fri, 30 Jan 1998 20:33:43 +0000 (20:33 +0000)
committerDavid Taylor <taylor@redhat.com>
Fri, 30 Jan 1998 20:33:43 +0000 (20:33 +0000)
from a function in one dynamically linked library into a function in another
dynamically linked library.

gdb/config/nm-gnu.h
gdb/config/nm-sysv4.h
gdb/solib.c
gdb/solib.h

index f59a2dc..b7ee4dc 100644 (file)
@@ -1,6 +1,6 @@
 /* Common declarations for the GNU Hurd
 
-   Copyright (C) 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1998 Free Software Foundation, Inc.
 
    Written by Miles Bader <miles@gnu.ai.mit.edu>
 
@@ -25,8 +25,6 @@
 #include <mach.h>
 #include <mach/exception.h>
 
-#include "solib.h"     /* Support for shared libraries. */
-
 #undef target_pid_to_str
 #define target_pid_to_str(pid) gnu_target_pid_to_str(pid)
 extern char *gnu_target_pid_to_str (int pid);
@@ -39,6 +37,7 @@ extern char *gnu_target_pid_to_str (int pid);
 
 /* Use SVR4 style shared library support */
 #define SVR4_SHARED_LIBS
+#include "solib.h"
 #define NO_CORE_OPS
 
 #define MAINTENANCE_CMDS 1
index e4978d0..b891d4d 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions for running gdb on a host machine running any flavor of SVR4.
-   Copyright 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1998 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support (fnf@cygnus.com).
 
 This file is part of GDB.
@@ -18,11 +18,10 @@ You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-#include "solib.h"     /* Support for shared libraries. */
-
 /* Use SVR4 style shared library support */
 
 #define SVR4_SHARED_LIBS
+#include "solib.h"
 
 /* SVR4 has /proc support, so use it instead of ptrace. */
 
index b8fffd7..b09b140 100644 (file)
@@ -1,5 +1,5 @@
 /* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998
    Free Software Foundation, Inc.
    
 This file is part of GDB.
@@ -70,6 +70,7 @@ static char *solib_break_names[] = {
   "r_debug_state",
   "_r_debug_state",
   "_dl_debug_state",
+  "rtld_db_dlactivity",
   NULL
 };
 #endif
@@ -148,12 +149,20 @@ static struct so_list *so_list_head;      /* List of known shared objects */
 static CORE_ADDR debug_base;           /* Base of dynamic linker structures */
 static CORE_ADDR breakpoint_addr;      /* Address where end bkpt is set */
 
+static int solib_cleanup_queued = 0;    /* make_run_cleanup called */
+
 extern int
 fdmatch PARAMS ((int, int));           /* In libiberty */
 
 /* Local function prototypes */
 
 static void
+do_clear_solib PARAMS ((PTR));
+
+static int
+match_main PARAMS ((char *));
+
+static void
 special_symbol_handling PARAMS ((struct so_list *));
 
 static void
@@ -936,6 +945,13 @@ find_solib (so_list_ptr)
       else
        {
          so_list_head = new;
+
+         if (! solib_cleanup_queued)
+           {
+             make_run_cleanup (do_clear_solib);
+             solib_cleanup_queued = 1;
+           }
+         
        }      
       so_list_next = new;
       read_memory ((CORE_ADDR) lm, (char *) &(new -> lm),
@@ -970,12 +986,34 @@ symbol_add_stub (arg)
      char *arg;
 {
   register struct so_list *so = (struct so_list *) arg;        /* catch_errs bogon */
+  CORE_ADDR text_addr = 0;
+
+  if (so -> textsection)
+    text_addr = so -> textsection -> addr;
+  else
+    {
+      asection *lowest_sect;
+
+      /* If we didn't find a mapped non zero sized .text section, set up
+        text_addr so that the relocation in symbol_file_add does no harm.  */
+
+      lowest_sect = bfd_get_section_by_name (so -> abfd, ".text");
+      if (lowest_sect == NULL)
+       bfd_map_over_sections (so -> abfd, find_lowest_section,
+                              (PTR) &lowest_sect);
+      if (lowest_sect)
+       text_addr = bfd_section_vma (so -> abfd, lowest_sect)
+                   + (CORE_ADDR) LM_ADDR (so);
+    }
   
+  ALL_OBJFILES (so -> objfile)
+    {
+      if (strcmp (so -> objfile -> name, so -> so_name) == 0)
+       return 1;
+    }
   so -> objfile =
     symbol_file_add (so -> so_name, so -> from_tty,
-                    (so->textsection == NULL
-                     ? 0
-                     : (unsigned int) so -> textsection -> addr),
+                    text_addr,
                     0, 0, 0);
   return (1);
 }
@@ -1262,6 +1300,34 @@ clear_solib()
   debug_base = 0;
 }
 
+static void
+do_clear_solib (dummy)
+     PTR dummy;
+{
+  solib_cleanup_queued = 0;
+  clear_solib ();
+}
+
+#ifdef SVR4_SHARED_LIBS
+
+/* Return 1 if PC lies in the dynamic symbol resolution code of the
+   SVR4 run time loader.  */
+
+static CORE_ADDR interp_text_sect_low;
+static CORE_ADDR interp_text_sect_high;
+static CORE_ADDR interp_plt_sect_low;
+static CORE_ADDR interp_plt_sect_high;
+
+int
+in_svr4_dynsym_resolve_code (pc)
+     CORE_ADDR pc;
+{
+  return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
+         || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
+         || in_plt_section (pc, NULL));
+}
+#endif
+
 /*
 
 LOCAL FUNCTION
@@ -1422,6 +1488,9 @@ enable_break ()
   remove_solib_event_breakpoints ();
 
 #ifdef SVR4_SHARED_LIBS
+  interp_text_sect_low = interp_text_sect_high = 0;
+  interp_plt_sect_low = interp_plt_sect_high = 0;
+
   /* Find the .interp section; if not found, warn the user and drop
      into the old breakpoint at symbol code.  */
   interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
@@ -1465,6 +1534,25 @@ enable_break ()
         linker) and subtracting the offset of the entry point.  */
       load_addr = read_pc () - tmp_bfd->start_address;
 
+      /* Record the relocated start and end address of the dynamic linker
+        text and plt section for in_svr4_dynsym_resolve_code.  */
+      interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
+      if (interp_sect)
+       {
+         interp_text_sect_low =
+           bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
+         interp_text_sect_high =
+           interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect);
+       }
+      interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
+      if (interp_sect)
+       {
+         interp_plt_sect_low =
+           bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
+         interp_plt_sect_high =
+           interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
+       }
+
       /* Now try to set a breakpoint in the dynamic linker.  */
       for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
        {
@@ -1506,7 +1594,7 @@ bkpt_at_symbol:
     }
 
   /* Nothing good happened.  */
-  return 0;
+  success = 0;
 
 #endif /* BKPT_AT_SYMBOL */
 
@@ -1747,14 +1835,14 @@ must be loaded manually, using `sharedlibrary'.",
   add_show_from_set
     (add_set_cmd ("solib-absolute-prefix", class_support, var_filename,
                  (char *) &solib_absolute_prefix,
-                 "Set prefix for loading absolute shared library symbol files.\n
+                 "Set prefix for loading absolute shared library symbol files.\n\
 For other (relative) files, you can add values using `set solib-search-path'.",
                  &setlist),
      &showlist);
   add_show_from_set
     (add_set_cmd ("solib-search-path", class_support, var_string,
                  (char *) &solib_search_path,
-                 "Set the search path for loading non-absolute shared library symbol files.\n
+                 "Set the search path for loading non-absolute shared library symbol files.\n\
 This takes precedence over the environment variables PATH and LD_LIBRARY_PATH.",
                  &setlist),
      &showlist);
index 959e59e..995f58e 100644 (file)
@@ -1,5 +1,5 @@
 /* Shared library declarations for GDB, the GNU Debugger.
-   Copyright (C) 1992 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1998 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -58,3 +58,15 @@ solib_address PARAMS ((CORE_ADDR));          /* solib.c */
 /* If ADDR lies in a shared library, return its name.  */
 
 #define PC_SOLIB(addr) solib_address (addr)
+
+#ifdef SVR4_SHARED_LIBS
+
+/* Return 1 if PC lies in the dynamic symbol resolution code of the
+   SVR4 run time loader.  */
+
+#define IN_SOLIB_DYNSYM_RESOLVE_CODE(pc) in_svr4_dynsym_resolve_code (pc)
+
+extern int
+in_svr4_dynsym_resolve_code PARAMS ((CORE_ADDR));
+
+#endif