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.
This commit is contained in:
parent
2dd3e587bd
commit
a7c02bc8e1
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
12
gdb/solib.c
12
gdb/solib.c
@ -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;
|
||||
|
@ -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 *). */
|
||||
|
Loading…
Reference in New Issue
Block a user