This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: Fix shared library events after attaching


This patch builds on top of the previous one (which I'd actually done for a
completely different reason) in order to fix PR 1914.  The bug report is
that we don't set the magical ld.so breakpoint after attaching to an
executable; therefore, symbols would not be read for dlopened libraries, et
cetera.

The cause was a missing call to SOLIB_CREATE_INFERIOR_HOOK.  But rather than
add it in another handful of places, this patch refactors it to be called
from post_create_inferior.  So when we connect to any kind of inferior,
we should end up at that function, and both enable the shared library
breakpoints and load the current list of shared libraries.  Just like my
last patch, this one mostly deletes duplicated code.

Tested on x86_64-pc-linux-gnu.  Any comments?  If not, I'll commit this one
if I get a favorable reaction to the to_create_inferior/proceed patch upon
which this depends.

-- 
Daniel Jacobowitz
CodeSourcery

2006-01-16  Daniel Jacobowitz  <dan@codesourcery.com>

	PR gdb/1914
	* fork-child.c (fork_inferior): Don't call
	solib_create_inferior_hook.
	* infcmd.c (post_create_inferior): Call solib_add,
	solib_create_inferior_hook, and re_enable_breakpoints_in_shlibs.
	(attach_command): Don't call solib_add or
	re_enable_breakpoints_in_shlibs.  Call post_create_inferior
	instead.
	* remote.c (remote_open_1): Don't call solib_create_inferior_hook
	or observer_notify_inferior_created.  Call post_create_inferior
	instead.
	* corelow.c: Don't include "observer.h".
	(solib_add_stub): Deleted.
	(core_open): Don't call observer_notify_inferior_created or
	solib_add_stub.  Call post_create_inferior instead.
	* inf-ptrace.c: Don't include "observer.h".
	(inf_ptrace_attach): Don't call observer_notify_inferior_created.
	* inf-ttrace.c: Don't include "observer.h".
	(inf_ttrace_attach): Don't call observer_notify_inferior_created.
	* inferior.h (solib_create_inferior_hook): Remove redundant
	prototype.
	* inftarg.c: Don't include "observer.h".
	(child_attach): Don't call observer_notify_inferior_created.
	* Makefile.in: Update dependencies.

Index: src/gdb/fork-child.c
===================================================================
--- src.orig/gdb/fork-child.c	2006-01-16 14:48:03.000000000 -0500
+++ src/gdb/fork-child.c	2006-01-16 15:15:05.000000000 -0500
@@ -1,7 +1,7 @@
 /* Fork a Unix child process, and set up to debug it, for GDB.
 
    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
-   2000, 2001, 2004 Free Software Foundation, Inc.
+   2000, 2001, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support.
 
@@ -403,12 +403,6 @@ fork_inferior (char *exec_file_arg, char
      might be used to have target-specific code initialize a variable
      in the new process prior to executing the first instruction.  */
   TARGET_CREATE_INFERIOR_HOOK (pid);
-
-#ifdef SOLIB_CREATE_INFERIOR_HOOK
-  SOLIB_CREATE_INFERIOR_HOOK (pid);
-#else
-  solib_create_inferior_hook ();
-#endif
 }
 
 /* Accept NTRAPS traps from the inferior.  */
Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/infcmd.c	2006-01-16 15:14:14.000000000 -0500
@@ -405,6 +405,30 @@ tty_command (char *file, int from_tty)
 void
 post_create_inferior (struct target_ops *target, int from_tty)
 {
+  if (exec_bfd)
+    {
+      /* Sometimes the platform-specific hook loads initial shared
+	 libraries, and sometimes it doesn't.  Try to do so first, so
+	 that we can add them with the correct value for FROM_TTY.  */
+#ifdef SOLIB_ADD
+      SOLIB_ADD (NULL, from_tty, target, auto_solib_add);
+#else
+      solib_add (NULL, from_tty, target, auto_solib_add);
+#endif
+
+      /* Create the hooks to handle shared library load and unload
+	 events.  */
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+      SOLIB_CREATE_INFERIOR_HOOK (pid);
+#else
+      solib_create_inferior_hook ();
+#endif
+
+      /* Enable any breakpoints which were disabled when the
+	 underlying shared library was deleted.  */
+      re_enable_breakpoints_in_shlibs ();
+    }
+
   observer_notify_inferior_created (target, from_tty);
 }
 
@@ -1899,18 +1923,12 @@ attach_command (char *args, int from_tty
       reread_symbols ();
     }
 
-#ifdef SOLIB_ADD
-  /* Add shared library symbols from the newly attached process, if any.  */
-  SOLIB_ADD ((char *) 0, from_tty, &current_target, auto_solib_add);
-#else
-  solib_add (NULL, from_tty, &current_target, auto_solib_add);
-#endif
-  re_enable_breakpoints_in_shlibs ();
-
   /* Take any necessary post-attaching actions for this platform.
    */
   target_post_attach (PIDGET (inferior_ptid));
 
+  post_create_inferior (&current_target, from_tty);
+
   /* Install inferior's terminal modes.  */
   target_terminal_inferior ();
 
Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/remote.c	2006-01-16 15:14:14.000000000 -0500
@@ -2295,24 +2295,10 @@ remote_open_1 (char *name, int from_tty,
       getpkt (buf, rs->remote_packet_size, 0);
     }
 
-  /* FIXME: need a master target_open vector from which all
-     remote_opens can be called, so that stuff like this can
-     go there.  Failing that, the following code must be copied
-     to the open function for any remote target that wants to
-     support svr4 shared libraries.  */
+  post_create_inferior (&current_target, from_tty);
 
-  /* Set up to detect and load shared libraries.  */
   if (exec_bfd) 	/* No use without an exec file.  */
-    {
-#ifdef SOLIB_CREATE_INFERIOR_HOOK
-      SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
-#else
-      solib_create_inferior_hook ();
-#endif
-      remote_check_symbols (symfile_objfile);
-    }
-
-  observer_notify_inferior_created (&current_target, from_tty);
+    remote_check_symbols (symfile_objfile);
 }
 
 /* This takes a program previously attached to and detaches it.  After
Index: src/gdb/corelow.c
===================================================================
--- src.orig/gdb/corelow.c	2006-01-16 14:48:03.000000000 -0500
+++ src/gdb/corelow.c	2006-01-16 15:14:14.000000000 -0500
@@ -1,7 +1,7 @@
 /* Core dump and executable file functions below target vector, for GDB.
 
    Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+   1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -43,7 +43,6 @@
 #include "symfile.h"
 #include "exec.h"
 #include "readline/readline.h"
-#include "observer.h"
 #include "gdb_assert.h"
 #include "exceptions.h"
 #include "solib.h"
@@ -236,21 +235,6 @@ core_close_cleanup (void *ignore)
   core_close (0/*ignored*/);
 }
 
-/* Stub function for catch_errors around shared library hacking.  FROM_TTYP
-   is really an int * which points to from_tty.  */
-
-static int
-solib_add_stub (void *from_ttyp)
-{
-#ifdef SOLIB_ADD
-  SOLIB_ADD (NULL, *(int *) from_ttyp, &current_target, auto_solib_add);
-#else
-  solib_add (NULL, *(int *)from_ttyp, &current_target, auto_solib_add);
-#endif
-  re_enable_breakpoints_in_shlibs ();
-  return 0;
-}
-
 /* Look for sections whose names start with `.reg/' so that we can extract the
    list of threads in a core file.  */
 
@@ -372,7 +356,7 @@ core_open (char *filename, int from_tty)
 
   /* This is done first, before anything has a chance to query the
      inferior for information such as symbols.  */
-  observer_notify_inferior_created (&core_ops, from_tty);
+  post_create_inferior (&core_ops, from_tty);
 
   p = bfd_core_file_failing_command (core_bfd);
   if (p)
@@ -398,9 +382,6 @@ core_open (char *filename, int from_tty)
       /* Fetch all registers from core file.  */
       target_fetch_registers (-1);
 
-      /* Add symbols and section mappings for any shared libraries.  */
-      catch_errors (solib_add_stub, &from_tty, (char *) 0, RETURN_MASK_ALL);
-
       /* Now, set up the frame cache, and print the top of stack.  */
       flush_cached_frames ();
       select_frame (get_current_frame ());
Index: src/gdb/inf-ptrace.c
===================================================================
--- src.orig/gdb/inf-ptrace.c	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/inf-ptrace.c	2006-01-16 15:14:14.000000000 -0500
@@ -26,7 +26,6 @@
 #include "inferior.h"
 #include "inflow.h"
 #include "gdbcore.h"
-#include "observer.h"
 #include "regcache.h"
 
 #include "gdb_assert.h"
@@ -222,10 +221,6 @@ inf_ptrace_attach (char *args, int from_
 
   inferior_ptid = pid_to_ptid (pid);
   push_target (ptrace_ops_hack);
-
-  /* Do this first, before anything has had a chance to query the
-     inferior's symbol table or similar.  */
-  observer_notify_inferior_created (&current_target, from_tty);
 }
 
 #ifdef PT_GET_PROCESS_STATE
Index: src/gdb/inf-ttrace.c
===================================================================
--- src.orig/gdb/inf-ttrace.c	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/inf-ttrace.c	2006-01-16 15:14:14.000000000 -0500
@@ -29,7 +29,6 @@
 #include "gdbcore.h"
 #include "gdbthread.h"
 #include "inferior.h"
-#include "observer.h"
 #include "target.h"
 
 #include "gdb_assert.h"
@@ -721,10 +720,6 @@ inf_ttrace_attach (char *args, int from_
 
   inferior_ptid = pid_to_ptid (pid);
   push_target (ttrace_ops_hack);
-
-  /* Do this first, before anything has had a chance to query the
-     inferior's symbol table or similar.  */
-  observer_notify_inferior_created (&current_target, from_tty);
 }
 
 static void
Index: src/gdb/inferior.h
===================================================================
--- src.orig/gdb/inferior.h	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/inferior.h	2006-01-16 15:14:14.000000000 -0500
@@ -213,8 +213,6 @@ extern void store_inferior_registers (in
 
 extern void fetch_inferior_registers (int);
 
-extern void solib_create_inferior_hook (void);
-
 extern void child_terminal_info (char *, int);
 
 extern void term_info (char *, int);
Index: src/gdb/inftarg.c
===================================================================
--- src.orig/gdb/inftarg.c	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/inftarg.c	2006-01-16 15:20:14.000000000 -0500
@@ -34,7 +34,6 @@
 #include <signal.h>
 #include <sys/types.h>
 #include <fcntl.h>
-#include "observer.h"
 #include "gdb_wait.h"
 #include "inflow.h"
 
@@ -210,10 +209,6 @@ child_attach (char *args, int from_tty)
   
   inferior_ptid = pid_to_ptid (pid);
   push_target (&deprecated_child_ops);
-
-  /* Do this first, before anything has had a chance to query the
-     inferior's symbol table or similar.  */
-  observer_notify_inferior_created (&current_target, from_tty);
 }
 
 #if !defined(CHILD_POST_ATTACH)
Index: src/gdb/Makefile.in
===================================================================
--- src.orig/gdb/Makefile.in	2006-01-16 14:48:05.000000000 -0500
+++ src/gdb/Makefile.in	2006-01-16 15:20:55.000000000 -0500
@@ -1831,7 +1831,7 @@ corefile.o: corefile.c $(defs_h) $(gdb_s
 corelow.o: corelow.c $(defs_h) $(arch_utils_h) $(gdb_string_h) $(frame_h) \
 	$(inferior_h) $(symtab_h) $(command_h) $(bfd_h) $(target_h) \
 	$(gdbcore_h) $(gdbthread_h) $(regcache_h) $(regset_h) $(symfile_h) \
-	$(exec_h) $(readline_h) $(observer_h) $(gdb_assert_h) \
+	$(exec_h) $(readline_h) $(gdb_assert_h) \
 	$(exceptions_h) $(solib_h)
 core-regset.o: core-regset.c $(defs_h) $(command_h) $(gdbcore_h) \
 	$(inferior_h) $(target_h) $(gdb_string_h) $(gregset_h)
@@ -2129,7 +2129,7 @@ inflow.o: inflow.c $(defs_h) $(frame_h) 
 	$(serial_h) $(terminal_h) $(target_h) $(gdbthread_h) $(gdb_string_h) \
 	$(inflow_h)
 inf-ptrace.o: inf-ptrace.c $(defs_h) $(command_h) $(inferior_h) $(inflow_h) \
-	$(gdbcore_h) $(observer_h) $(regcache_h) $(gdb_assert_h) \
+	$(gdbcore_h) $(regcache_h) $(gdb_assert_h) \
 	$(gdb_string_h) $(gdb_ptrace_h) $(gdb_wait_h) $(inf_child_h)
 infptrace.o: infptrace.c $(defs_h) $(command_h) $(frame_h) $(gdbcore_h) \
 	$(inferior_h) $(regcache_h) $(target_h) $(gdb_assert_h) \
@@ -2141,10 +2141,10 @@ infrun.o: infrun.c $(defs_h) $(gdb_strin
 	$(value_h) $(observer_h) $(language_h) $(solib_h) $(gdb_assert_h) \
 	$(mi_common_h) $(main_h)
 inftarg.o: inftarg.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \
-	$(gdbcore_h) $(command_h) $(gdb_stat_h) $(observer_h) $(gdb_wait_h) \
+	$(gdbcore_h) $(command_h) $(gdb_stat_h) $(gdb_wait_h) \
 	$(inflow_h)
 inf-ttrace.o: inf-ttrace.c $(defs_h) $(command_h) $(gdbcore_h) \
-	$(gdbthread_h) $(inferior_h) $(observer_h) $(target_h) \
+	$(gdbthread_h) $(inferior_h) $(target_h) \
 	$(gdb_assert_h) $(gdb_string_h) $(inf_child_h) $(inf_ttrace_h)
 interps.o: interps.c $(defs_h) $(gdbcmd_h) $(ui_out_h) $(event_loop_h) \
 	$(event_top_h) $(interps_h) $(completer_h) $(gdb_string_h) \


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]