Ignore change in name of dynamic linker during
authorVladimir Prus <vladimir@codesourcery.com>
Mon, 7 Jan 2008 15:19:58 +0000 (15:19 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Mon, 7 Jan 2008 15:19:58 +0000 (15:19 +0000)
execution, on Solaris.  This also unbreaks pending breakpoints.

* solist.h (struct target_so_ops): New field same.
        * solib-svr4.c (svr4_same): New.
        (_initialize_svr4_solib): Register svr4_same.
        * solib.c (update_solib_list): Use ops->same, if available.

gdb/ChangeLog
gdb/solib-svr4.c
gdb/solib.c
gdb/solist.h

index 370f829d2407f8deca1425749ac3ae84b7255566..66d677e337d583c038ecefabeff8498520b5300d 100644 (file)
@@ -1,3 +1,13 @@
+2008-01-07  Vladimir Prus  <vladimir@codesourcery.com>
+
+       Ignore change in name of dynamic linker during
+       execution on Solaris.  This also unbreaks pending breakpoints.
+
+       * solist.h (struct target_so_ops): New field same.
+        * solib-svr4.c (svr4_same): New.
+        (_initialize_svr4_solib): Register svr4_same.
+        * solib.c (update_solib_list): Use ops->same, if available.
+
 2008-01-06  Christopher Faylor  <me+cygwin@cgf.cx>
 
        * win32-nat.c (win32_make_so): Use cygwin-style path to avoid warnings
index ef460aac24289d6d6412090dd2e8565350aecb11..4c9e82dd9409e57c592f9eb3538e23d24a2e83c8 100644 (file)
@@ -1569,6 +1569,25 @@ elf_lookup_lib_symbol (const struct objfile *objfile,
                (objfile, name, linkage_name, domain, symtab);
 }
 
+static int
+svr4_same (struct so_list *gdb, struct so_list *inferior)
+{
+  if (! strcmp (gdb->so_original_name, inferior->so_original_name))
+    return 1;
+
+  /* On Solaris, when starting inferior we think that dynamic linker is
+     /usr/lib/ld.so.1, but later on, the table of loaded shared libraries 
+     contains /lib/ld.so.1.  Sometimes one file is a link to another, but 
+     sometimes they have identical content, but are not linked to each
+     other.  We don't restrict this check for Solaris, but the chances
+     of running into this situation elsewhere are very low.  */
+  if (strcmp (gdb->so_original_name, "/usr/lib/ld.so.1") == 0
+      && strcmp (inferior->so_original_name, "/lib/ld.so.1") == 0)
+    return 1;
+
+  return 0;
+}
+
 extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */
 
 void
@@ -1585,4 +1604,5 @@ _initialize_svr4_solib (void)
   svr4_so_ops.open_symbol_file_object = open_symbol_file_object;
   svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code;
   svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol;
+  svr4_so_ops.same = svr4_same;
 }
index 815ab292269587447368b3afec96b9fc29c273e3..69680b455cbb2ef24099261eb4728fc9dcda427b 100644 (file)
@@ -538,8 +538,16 @@ update_solib_list (int from_tty, struct target_ops *target)
         the inferior's current list.  */
       while (i)
        {
-         if (! strcmp (gdb->so_original_name, i->so_original_name))
-           break;
+         if (ops->same)
+           {
+             if (ops->same (gdb, i))
+               break;
+           }
+         else
+           {
+             if (! strcmp (gdb->so_original_name, i->so_original_name))
+               break;        
+           }
 
          i_link = &i->next;
          i = *i_link;
index a047177e296bf2df9d2c8bc88b8f8280b01e3207..01f734fcdad404414a356f6058e447a54b0182a4 100644 (file)
@@ -115,6 +115,10 @@ struct target_so_ops
                                                 const domain_enum domain,
                                                 struct symtab **symtab);
 
+    /* Given two so_list objects, one from the GDB thread list
+       and another from the list returned by current_sos, return 1
+       if they represent the same library.  */
+    int (*same) (struct so_list *gdb, struct so_list *inferior);
   };
 
 /* Free the memory associated with a (so_list *).  */