aboutsummaryrefslogtreecommitdiff
path: root/gdb/somsolib.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1996-02-19 17:38:32 +0000
committerJeff Law <law@redhat.com>1996-02-19 17:38:32 +0000
commitff7f8f2d1e8f216693d815116d168166603ba262 (patch)
tree64f431eeab153685692068e70477448986860eee /gdb/somsolib.c
parenta9c5cc539ed6cb39e88f24d68c948590f38d096f (diff)
downloadfsf-binutils-gdb-ff7f8f2d1e8f216693d815116d168166603ba262.zip
fsf-binutils-gdb-ff7f8f2d1e8f216693d815116d168166603ba262.tar.gz
fsf-binutils-gdb-ff7f8f2d1e8f216693d815116d168166603ba262.tar.bz2
* symtab.h (looup_minimal_symbol_solib_trampoline): Declare.
Minor build nit. * breakpoint.h (remove_solib_event_breakpoints): Declare. * breakpoint.c (remove_solib_event_breakpoints): New function. * somsolib.c (solib_create_inferior_hook): Remove all solib event breakpoints before inserting any new ones. Use a solib event breakpoint for the breakpoint at "_start". Remove extraneous "\n" from calls to warning. Don't leave bogus breakpoints in the breakpoint chain. Simplify solib_create_inferior_hook and allow for debugging of startup code (more 7763 related changes). * breakpoint.c (breakpoint_1): Add missing "sigtramp" to bptypes name array. Another minor nit.
Diffstat (limited to 'gdb/somsolib.c')
-rw-r--r--gdb/somsolib.c65
1 files changed, 22 insertions, 43 deletions
diff --git a/gdb/somsolib.c b/gdb/somsolib.c
index ebec205..9e36d19 100644
--- a/gdb/somsolib.c
+++ b/gdb/somsolib.c
@@ -501,6 +501,10 @@ som_solib_create_inferior_hook()
struct objfile *objfile;
CORE_ADDR anaddr;
+ /* First, remove all the solib event breakpoints. Their addresses
+ may have changed since the last time we ran the program. */
+ remove_solib_event_breakpoints ();
+
if (symfile_objfile == NULL)
return;
@@ -518,9 +522,9 @@ som_solib_create_inferior_hook()
msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile);
if (msymbol == NULL)
{
- warning ("Unable to find __d_pid symbol in object file.\n");
- warning ("Suggest linking with /usr/lib/end.o.\n");
- warning ("GDB will be unable to track shl_load/shl_unload calls\n");
+ warning ("Unable to find __d_pid symbol in object file.");
+ warning ("Suggest linking with /usr/lib/end.o.");
+ warning ("GDB will be unable to track shl_load/shl_unload calls");
goto keep_going;
}
@@ -529,9 +533,9 @@ som_solib_create_inferior_hook()
status = target_write_memory (anaddr, buf, 4);
if (status != 0)
{
- warning ("Unable to write __d_pid\n");
- warning ("Suggest linking with /usr/lib/end.o.\n");
- warning ("GDB will be unable to track shl_load/shl_unload calls\n");
+ warning ("Unable to write __d_pid");
+ warning ("Suggest linking with /usr/lib/end.o.");
+ warning ("GDB will be unable to track shl_load/shl_unload calls");
goto keep_going;
}
@@ -541,9 +545,9 @@ som_solib_create_inferior_hook()
msymbol = lookup_minimal_symbol ("_DLD_HOOK", NULL, symfile_objfile);
if (msymbol == NULL)
{
- warning ("Unable to find _DLD_HOOK symbol in object file.\n");
- warning ("Suggest linking with /usr/lib/end.o.\n");
- warning ("GDB will be unable to track shl_load/shl_unload calls\n");
+ warning ("Unable to find _DLD_HOOK symbol in object file.");
+ warning ("Suggest linking with /usr/lib/end.o.");
+ warning ("GDB will be unable to track shl_load/shl_unload calls");
goto keep_going;
}
anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
@@ -580,9 +584,9 @@ som_solib_create_inferior_hook()
msymbol = lookup_minimal_symbol ("__dld_hook", NULL, symfile_objfile);
if (msymbol == NULL)
{
- warning ("Unable to find __dld_hook symbol in object file.\n");
- warning ("Suggest linking with /usr/lib/end.o.\n");
- warning ("GDB will be unable to track shl_load/shl_unload calls\n");
+ warning ("Unable to find __dld_hook symbol in object file.");
+ warning ("Suggest linking with /usr/lib/end.o.");
+ warning ("GDB will be unable to track shl_load/shl_unload calls");
goto keep_going;
}
anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
@@ -593,9 +597,9 @@ som_solib_create_inferior_hook()
msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
if (msymbol == NULL)
{
- warning ("Unable to find __dld_d_trap symbol in object file.\n");
- warning ("Suggest linking with /usr/lib/end.o.\n");
- warning ("GDB will be unable to track shl_load/shl_unload calls\n");
+ warning ("Unable to find __dld_d_trap symbol in object file.");
+ warning ("Suggest linking with /usr/lib/end.o.");
+ warning ("GDB will be unable to track shl_load/shl_unload calls");
goto keep_going;
}
create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
@@ -653,11 +657,9 @@ keep_going:
}
anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
- if (target_insert_breakpoint (anaddr, shadow_contents))
- {
- error ("Unable to set breakpoint at _start.\n");
- return;
- }
+
+ /* Make the breakpoint at "_start" a shared library event breakpoint. */
+ create_solib_event_breakpoint (anaddr);
/* Wipe out all knowledge of old shared libraries since their
mapping can change from one exec to another! */
@@ -670,29 +672,6 @@ keep_going:
free (so_list_head);
so_list_head = temp->next;
}
-
- /* Start the process again and wait for it to hit our breakpoint. */
- clear_proceed_status ();
- stop_soon_quietly = 1;
- stop_signal = TARGET_SIGNAL_0;
- do
- {
- target_resume (-1, 0, stop_signal);
- wait_for_inferior ();
- }
- while (stop_signal != TARGET_SIGNAL_TRAP);
- stop_soon_quietly = 0;
-
- /* All the libraries should be mapped in now. Remove our breakpoint and
- read in the symbol tables from the shared libraries. */
- if (target_remove_breakpoint (anaddr, shadow_contents))
- {
- error ("Unable to remove breakpoint at _start.\n");
- return;
- }
-
- if (auto_solib_add)
- som_solib_add ((char *) 0, 0, (struct target_ops *) 0);
}
/* Return the GOT value for the shared library in which ADDR belongs. If