summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/solib-svr4.c22
-rw-r--r--gdb/solib.c8
-rw-r--r--gdb/solist.h4
4 files changed, 29 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1ef8c4217fa..be7fc1476f6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2004-03-11 Kevin Buettner <kevinb@redhat.com>
+
+ * solist.h (master_so_list): New function.
+ * solib.c (master_so_list): Likewise.
+ * solib-svr4.c (enable_break): Iterate over so_list entries
+ obtained from master list instead of entries obtained directly
+ via svr4_current_sos().
+
2004-03-10 Ben Elliston <bje@gnu.org>
* MAINTAINERS: Update my mail address.
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 4f4664cc017..020a55c2844 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1004,7 +1004,7 @@ enable_break (void)
char *buf;
CORE_ADDR load_addr = 0;
int load_addr_found = 0;
- struct so_list *inferior_sos;
+ struct so_list *so;
bfd *tmp_bfd = NULL;
struct target_ops *tmp_bfd_target;
int tmp_fd = -1;
@@ -1047,23 +1047,19 @@ enable_break (void)
target will also close the underlying bfd. */
tmp_bfd_target = target_bfd_reopen (tmp_bfd);
- /* If the entry in _DYNAMIC for the dynamic linker has already
- been filled in, we can read its base address from there. */
- inferior_sos = svr4_current_sos ();
- if (inferior_sos)
+ /* On a running target, we can get the dynamic linker's base
+ address from the shared library table. */
+ solib_add (NULL, 0, NULL, auto_solib_add);
+ so = master_so_list ();
+ while (so)
{
- /* Connected to a running target. Update our shared library table. */
- solib_add (NULL, 0, NULL, auto_solib_add);
- }
- while (inferior_sos)
- {
- if (strcmp (buf, inferior_sos->so_original_name) == 0)
+ if (strcmp (buf, so->so_original_name) == 0)
{
load_addr_found = 1;
- load_addr = LM_ADDR (inferior_sos);
+ load_addr = LM_ADDR (so);
break;
}
- inferior_sos = inferior_sos->next;
+ so = so->next;
}
/* Otherwise we find the dynamic linker's base address by examining
diff --git a/gdb/solib.c b/gdb/solib.c
index a98c3bdfed7..137fc709fd4 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -333,6 +333,14 @@ free_so (struct so_list *so)
}
+/* Return address of first so_list entry in master shared object list. */
+struct so_list *
+master_so_list (void)
+{
+ return so_list_head;
+}
+
+
/* A small stub to get us past the arg-passing pinhole of catch_errors. */
static int
diff --git a/gdb/solist.h b/gdb/solist.h
index 8e5c4321855..7977c541fc1 100644
--- a/gdb/solist.h
+++ b/gdb/solist.h
@@ -107,8 +107,12 @@ struct target_so_ops
};
+/* Free the memory associated with a (so_list *). */
void free_so (struct so_list *so);
+/* Return address of first so_list entry in master shared object list. */
+struct so_list *master_so_list (void);
+
/* Find solib binary file and open it. */
extern int solib_open (char *in_pathname, char **found_pathname);