Replace SKIP_SOLIB_RESOLVER stub with something that works.

2000-05-25  Scott Bambrough <scottb@netwinder.org>

	* arm-linux-tdep.c (find_minsym_and_objfile): New.
	(skip_hurd_resolver): New.
	(arm_linux_skip_solib_resolver): New.
	(arm_skip_solib_resolver): Removed.

	* config/arm/tm-linux.h (SKIP_SOLIB_RESOLVER): Changed to use
	arm_linux_skip_solib_resolver.
This commit is contained in:
Scott Bambrough 2000-05-25 18:24:33 +00:00
parent 7dfa765cc1
commit a52e6aac8a
3 changed files with 101 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2000-05-25 Scott Bambrough <scottb@netwinder.org>
* arm-linux-tdep.c (find_minsym_and_objfile): New.
(skip_hurd_resolver): New.
(arm_linux_skip_solib_resolver): New.
(arm_skip_solib_resolver): Removed.
* config/arm/tm-linux.h (SKIP_SOLIB_RESOLVER): Changed to use
arm_linux_skip_solib_resolver.
2000-05-25 Mark Kettenis <kettenis@gnu.org>
* acconfig.h (HAVE_R_FS, HAVE_R_GS): Add.

View File

@ -24,6 +24,11 @@
#include "gdbtypes.h"
#include "floatformat.h"
/* For arm_linux_skip_solib_resolver. */
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#ifdef GET_LONGJMP_TARGET
/* Figure out where the longjmp will land. We expect that we have
@ -340,10 +345,91 @@ arm_linux_push_arguments (int nargs, value_ptr * args, CORE_ADDR sp,
with. Before the fixup/resolver code returns, it actually calls
the requested function and repairs &GOT[n+3]. */
CORE_ADDR
arm_skip_solib_resolver (CORE_ADDR pc)
/* Find the minimal symbol named NAME, and return both the minsym
struct and its objfile. This probably ought to be in minsym.c, but
everything there is trying to deal with things like C++ and
SOFUN_ADDRESS_MAYBE_TURQUOISE, ... Since this is so simple, it may
be considered too special-purpose for general consumption. */
static struct minimal_symbol *
find_minsym_and_objfile (char *name, struct objfile **objfile_p)
{
/* FIXME */
struct objfile *objfile;
ALL_OBJFILES (objfile)
{
struct minimal_symbol *msym;
ALL_OBJFILE_MSYMBOLS (objfile, msym)
{
if (SYMBOL_NAME (msym)
&& STREQ (SYMBOL_NAME (msym), name))
{
*objfile_p = objfile;
return msym;
}
}
}
return 0;
}
static CORE_ADDR
skip_hurd_resolver (CORE_ADDR pc)
{
/* The HURD dynamic linker is part of the GNU C library, so many
GNU/Linux distributions use it. (All ELF versions, as far as I
know.) An unresolved PLT entry points to "_dl_runtime_resolve",
which calls "fixup" to patch the PLT, and then passes control to
the function.
We look for the symbol `_dl_runtime_resolve', and find `fixup' in
the same objfile. If we are at the entry point of `fixup', then
we set a breakpoint at the return address (at the top of the
stack), and continue.
It's kind of gross to do all these checks every time we're
called, since they don't change once the executable has gotten
started. But this is only a temporary hack --- upcoming versions
of Linux will provide a portable, efficient interface for
debugging programs that use shared libraries. */
struct objfile *objfile;
struct minimal_symbol *resolver
= find_minsym_and_objfile ("_dl_runtime_resolve", &objfile);
if (resolver)
{
struct minimal_symbol *fixup
= lookup_minimal_symbol ("fixup", 0, objfile);
if (fixup && SYMBOL_VALUE_ADDRESS (fixup) == pc)
return (SAVED_PC_AFTER_CALL (get_current_frame ()));
}
return 0;
}
/* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
This function:
1) decides whether a PLT has sent us into the linker to resolve
a function reference, and
2) if so, tells us where to set a temporary breakpoint that will
trigger when the dynamic linker is done. */
CORE_ADDR
arm_linux_skip_solib_resolver (CORE_ADDR pc)
{
CORE_ADDR result;
/* Plug in functions for other kinds of resolvers here. */
result = skip_hurd_resolver (pc);
printf ("Result = 0x%08x\n");
if (result)
return result;
return 0;
}

View File

@ -118,8 +118,8 @@ extern CORE_ADDR find_solib_trampoline_target (CORE_ADDR pc);
need to skip over the dynamic linker call. This function decides
when to skip, and where to skip to. See the comments for
SKIP_SOLIB_RESOLVER at the top of infrun.c. */
extern CORE_ADDR arm_skip_solib_resolver (CORE_ADDR pc);
#define SKIP_SOLIB_RESOLVER arm_skip_solib_resolver
extern CORE_ADDR arm_linux_skip_solib_resolver (CORE_ADDR pc);
#define SKIP_SOLIB_RESOLVER arm_linux_skip_solib_resolver
/* When we call a function in a shared library, and the PLT sends us
into the dynamic linker to find the function's real address, we