aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2008-01-07 15:19:58 +0000
committerVladimir Prus <vladimir@codesourcery.com>2008-01-07 15:19:58 +0000
commita7c02bc8e11894a2c8ac3f834961f214229a4d51 (patch)
tree966dda90f1fa480b7e9b4648f5c559f85ca3e02d /gdb
parent2dd3e587bdab39d73086c35be60399e096d48b46 (diff)
downloadfsf-binutils-gdb-a7c02bc8e11894a2c8ac3f834961f214229a4d51.zip
fsf-binutils-gdb-a7c02bc8e11894a2c8ac3f834961f214229a4d51.tar.gz
fsf-binutils-gdb-a7c02bc8e11894a2c8ac3f834961f214229a4d51.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/solib-svr4.c20
-rw-r--r--gdb/solib.c12
-rw-r--r--gdb/solist.h4
4 files changed, 44 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 370f829..66d677e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index ef460aa..4c9e82d 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -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;
}
diff --git a/gdb/solib.c b/gdb/solib.c
index 815ab29..69680b4 100644
--- a/gdb/solib.c
+++ b/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;
diff --git a/gdb/solist.h b/gdb/solist.h
index a047177..01f734f 100644
--- a/gdb/solist.h
+++ b/gdb/solist.h
@@ -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 *). */