* From Peter Schauer:
authorJeff Law <law@redhat.com>
Mon, 4 Mar 1996 21:50:10 +0000 (21:50 +0000)
committerJeff Law <law@redhat.com>
Mon, 4 Mar 1996 21:50:10 +0000 (21:50 +0000)
        * infrun.c (wait_for_inferior): Remove breakpoints and
        switch terminal settings before calling SOLIB_ADD.
        * solib.c (enable_break, SVR4 variant): Don't map in symbols
        for the dynamic linker, the namespace pollution causes real
        problems.

gdb/ChangeLog
gdb/infrun.c
gdb/solib.c

index 45bf2b457323deae9d289f9f28c987fe26a2596f..446099880f87019e026de6d94072db22436ecec9 100644 (file)
@@ -1,3 +1,12 @@
+Mon Mar  4 14:44:54 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * From Peter Schauer:
+       * infrun.c (wait_for_inferior): Remove breakpoints and
+       switch terminal settings before calling SOLIB_ADD.
+       * solib.c (enable_break, SVR4 variant): Don't map in symbols
+       for the dynamic linker, the namespace pollution causes real
+       problems.
+
 Sun Mar  3 17:18:57 1996  James G. Smith  <jsmith@cygnus.co.uk>
 
        * remote-mips.c (common_breakpoint): Explicitly terminate the
index 19ff2d3dd66e374f76083ca1efed2b8100704047..623e1da8b9ac859f374a1719fae3b7c94d1d4e79 100644 (file)
@@ -1042,7 +1042,19 @@ wait_for_inferior ()
              /* Check for any newly added shared libraries if we're
                 supposed to be adding them automatically.  */
              if (auto_solib_add)
-               SOLIB_ADD (NULL, 0, NULL);
+               {
+                 /* Remove breakpoints, SOLIB_ADD might adjust breakpoint
+                    addresses via breakpoint_re_set.  */
+                 if (breakpoints_inserted)
+                   remove_breakpoints ();
+                 breakpoints_inserted = 0;
+
+                 /* Switch terminal for any messages produced by
+                    breakpoint_re_set.  */
+                 target_terminal_ours_for_output ();
+                 SOLIB_ADD (NULL, 0, NULL);
+                 target_terminal_inferior ();
+               }
 
              /* If requested, stop when the dynamic linker notifies
                 gdb of events.  This allows the user to get control
@@ -1658,7 +1670,9 @@ Further execution is probably impossible.\n");
 
   target_terminal_ours ();
 
-  if (stop_bpstat && stop_bpstat->breakpoint_at->type == bp_shlib_event)
+  if (stop_bpstat
+      && stop_bpstat->breakpoint_at
+      && stop_bpstat->breakpoint_at->type == bp_shlib_event)
     printf_filtered ("Stopped due to shared library event\n");
 
   /* Look up the hook_stop and run it if it exists.  */
index cc6019680d75a249d72655ae1674c3b729b3ce23..d0319bfd161afae06d61cd021fc96e12c542a7b1 100644 (file)
@@ -1371,9 +1371,7 @@ enable_break ()
 #ifdef BKPT_AT_SYMBOL
 
   struct minimal_symbol *msymbol;
-  struct objfile *objfile;
   char **bkpt_namep;
-  CORE_ADDR bkpt_addr;
   asection *interp_sect;
 
   /* First, remove all the solib event breakpoints.  Their addresses
@@ -1390,7 +1388,7 @@ enable_break ()
       char *buf;
       CORE_ADDR load_addr;
       bfd *tmp_bfd;
-      asection *lowest_sect;
+      CORE_ADDR sym_addr = 0;
 
       /* Read the contents of the .interp section into a local buffer;
         the contents specify the dynamic linker this program uses.  */
@@ -1424,42 +1422,21 @@ enable_break ()
         linker) and subtracting the offset of the entry point.  */
       load_addr = read_pc () - tmp_bfd->start_address;
 
-      /* load_addr now has the base address of the dynamic linker;
-        however, due to severe braindamage in syms_from_objfile
-        we need to add the address of the .text section, or the
-        lowest section of .text doesn't exist to work around the
-        braindamage.  Gross.  */
-      lowest_sect = bfd_get_section_by_name (tmp_bfd, ".text");
-      if (lowest_sect == NULL)
-        bfd_map_over_sections (tmp_bfd, find_lowest_section,
-                               (PTR) &lowest_sect);
-
-      if (lowest_sect == NULL)
+      /* Now try to set a breakpoint in the dynamic linker.  */
+      for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
        {
-         warning ("Unable to find base address for dynamic linker %s\n", buf);
-         bfd_close (tmp_bfd);
-         goto bkpt_at_symbol;
+         sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep);
+         if (sym_addr != 0)
+           break;
        }
 
-      load_addr += bfd_section_vma (tmp_bfd, lowest_sect);
-
       /* We're done with the temporary bfd.  */
       bfd_close (tmp_bfd);
 
-      /* Now make GDB aware of the symbols in the dynamic linker.  Some
-        might complain about namespace pollution, but as a developer I've
-        often wanted these symbols available from within the debugger.  */
-      objfile = symbol_file_add (buf, 0, load_addr, 0, 0, 1);
-
-      /* Now try to set a breakpoint in the dynamic linker.  */
-      for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
+      if (sym_addr != 0)
        {
-         msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, objfile);
-         if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
-           {
-             create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
-             return 1;
-           }
+         create_solib_event_breakpoint (load_addr + sym_addr);
+         return 1;
        }
 
       /* For whatever reason we couldn't set a breakpoint in the dynamic