+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
(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
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;
}
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;
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 *). */