* solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Do not ignore the
authorDaniel Jacobowitz <drow@false.org>
Fri, 13 Apr 2007 13:54:06 +0000 (13:54 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 13 Apr 2007 13:54:06 +0000 (13:54 +0000)
first entry for static executables.
(breakpoint_addr): Delete unused variable.
(elf_locate_base): Search for _r_debug in static executables.
(enable_break): Do not set breakpoint_addr.  Scan solib_break_names
also.

gdb/ChangeLog
gdb/solib-svr4.c

index ed65bd6dc3db32e45cd764d4c7fa268d31985f91..dddffe84739713de796fd593be2f962c5c8d55de 100644 (file)
@@ -1,3 +1,12 @@
+2007-04-13  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Do not ignore the
+       first entry for static executables.
+       (breakpoint_addr): Delete unused variable.
+       (elf_locate_base): Search for _r_debug in static executables.
+       (enable_break): Do not set breakpoint_addr.  Scan solib_break_names
+       also.
+
 2007-04-13  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * breakpoint.c (update_breakpoints_after_exec, print_it_typical)
index 54a27b3b656ea1f3ef6aab251182d2dc649d24ab..105ff3397cfa4813f69479c52a4bd0bde620eac4 100644 (file)
@@ -239,12 +239,16 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
 {
   struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
 
+  /* Assume that everything is a library if the dynamic loader was loaded
+     late by a static executable.  */
+  if (bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL)
+    return 0;
+
   return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset,
                                builtin_type_void_data_ptr) == 0;
 }
 
 static CORE_ADDR debug_base;   /* Base of dynamic linker structures */
-static CORE_ADDR breakpoint_addr;      /* Address where end bkpt is set */
 
 /* Validity flag for debug_loader_offset.  */
 static int debug_loader_offset_p;
@@ -387,7 +391,18 @@ elf_locate_base (void)
   /* Find the start address of the .dynamic section.  */
   dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic");
   if (dyninfo_sect == NULL)
-    return 0;
+    {
+      /* This may be a static executable.  Look for the symbol
+        conventionally named _r_debug, as a last resort.  */
+      struct minimal_symbol *msymbol;
+
+      msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
+      if (msymbol != NULL)
+       return SYMBOL_VALUE_ADDRESS (msymbol);
+      else
+       return 0;
+    }
+
   dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect);
 
   /* Read in .dynamic section, silently ignore errors.  */
@@ -1111,10 +1126,19 @@ enable_break (void)
                "and track explicitly loaded dynamic code."));
     }
 
-  /* Scan through the list of symbols, trying to look up the symbol and
-     set a breakpoint there.  Terminate loop when we/if we succeed. */
+  /* Scan through the lists of symbols, trying to look up the symbol and
+     set a breakpoint there.  Terminate loop when we/if we succeed.  */
+
+  for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
+    {
+      msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
+      if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+       {
+         create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
+         return 1;
+       }
+    }
 
-  breakpoint_addr = 0;
   for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
     {
       msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);