aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/hppa-tdep.c13
-rw-r--r--gdb/somsolib.c25
-rw-r--r--gdb/somsolib.h3
4 files changed, 46 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1cc50c5..ebdacb0 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+Wed Nov 30 22:27:27 1994 Jeff Law (law@snake.cs.utah.edu)
+
+ * somsolib.c (som_solib_get_got_by_pc): New function.
+ * somsolib.h (som_solib_get_got_by_pc): Add extern decl.
+ * hppa-tdep.c (hppa_fix_call_dummy): Handle case where FUN is the
+ function's export stub or real address in a shared library.
+
Tue Nov 29 13:40:25 1994 J.T. Conklin (jtc@rtl.cygnus.com)
* config/i386/nbsd.mh (REGEX, REGEX1): No longer define.
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 687b309..d765b94 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -1378,6 +1378,19 @@ hppa_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
at *fun. */
fun = (CORE_ADDR) read_memory_integer (fun & ~0x3, 4);
}
+ else
+ {
+
+ /* FUN could be either an export stub, or the real address of a
+ function in a shared library.
+
+ To call this function we need to get the GOT/DP value for the target
+ function. Do this by calling shared library support routines in
+ somsolib.c. Once the GOT value is in %r19 we can call the procedure
+ in the normal fashion. */
+
+ write_register (19, som_solib_get_got_by_pc (fun));
+ }
/* If we are calling an import stub (eg calling into a dynamic library)
then have sr4export call the magic __d_plt_call routine which is linked
diff --git a/gdb/somsolib.c b/gdb/somsolib.c
index f75ad9c..fc3d2ad 100644
--- a/gdb/somsolib.c
+++ b/gdb/somsolib.c
@@ -43,8 +43,6 @@ and by Cygnus Support. */
* Do we need/want a command to load a shared library?
- * Test attaching to running dynamically linked code.
-
* Support for hpux8 dynamic linker.
* Support for tracking user calls to dld_load, dld_unload. */
@@ -544,6 +542,29 @@ som_solib_create_inferior_hook()
som_solib_add ((char *) 0, 0, (struct target_ops *) 0);
}
+/* Return the GOT value for the shared library in which ADDR belongs. If
+ ADDR isn't in any known shared library, return zero. */
+
+CORE_ADDR
+som_solib_get_got_by_pc (addr)
+ CORE_ADDR addr;
+{
+ struct so_list *so_list = so_list_head;
+ CORE_ADDR got_value = 0;
+
+ while (so_list)
+ {
+ if (so_list->som_solib.text_addr <= addr
+ && so_list->som_solib.text_end > addr)
+ {
+ got_value = so_list->som_solib.got_value;
+ break;
+ }
+ so_list = so_list->next;
+ }
+ return got_value;
+}
+
/* Dump information about all the currently loaded shared libraries. */
static void
diff --git a/gdb/somsolib.h b/gdb/somsolib.h
index f6b0115..8df2062 100644
--- a/gdb/somsolib.h
+++ b/gdb/somsolib.h
@@ -32,6 +32,9 @@ struct target_ops;
extern void
som_solib_add PARAMS ((char *, int, struct target_ops *));
+extern CORE_ADDR
+som_solib_get_got_by_pc PARAMS ((CORE_ADDR));
+
/* Function to be called when the inferior starts up, to discover the names
of shared libraries that are dynamically linked, the base addresses to
which they are linked, and sufficient information to read in their symbols