This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFC: Fix shared library events after attaching
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sourceware dot org
- Date: Mon, 16 Jan 2006 15:28:43 -0500
- Subject: 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, ¤t_target, auto_solib_add);
-#else
- solib_add (NULL, from_tty, ¤t_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 (¤t_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 (¤t_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 (¤t_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, ¤t_target, auto_solib_add);
-#else
- solib_add (NULL, *(int *)from_ttyp, ¤t_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 (¤t_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 (¤t_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 (¤t_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) \