From b1bbe38b3d1906c0df6d5aca0ec28d3b3a43626b Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 1 Dec 1994 05:34:30 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 7 +++++++ gdb/hppa-tdep.c | 13 +++++++++++++ gdb/somsolib.c | 25 +++++++++++++++++++++++-- gdb/somsolib.h | 3 +++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1cc50c528bb..ebdacb0194f 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 687b309ae12..d765b94da2c 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 f75ad9c80ac..fc3d2ad15fe 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 f6b01157668..8df2062de50 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 -- 2.34.1