This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] Linux: move solib code from native to target module.
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: [RFA] Linux: move solib code from native to target module.
- From: Michael Snyder <msnyder at redhat dot com>
- Date: Tue, 29 Aug 2000 15:45:17 -0700
- Organization: Red Hat, Inc.
This change enables me to build a cross-debugger with
i386 linux as the target.
2000-08-29 Michael Snyder <msnyder@cleaver.cygnus.com>
* i386-linux-nat.c (i386_linux_skip_solib_resolver,
skip_hurd_resolver, find_minsym_and_objfile): Move these
solib functions into i386-linux-tdep.c for cross debugging.
* i386-linux-tdep.c: Receive the above functions.
Index: i386-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-nat.c,v
retrieving revision 1.16
diff -c -r1.16 i386-linux-nat.c
*** i386-linux-nat.c 2000/08/28 21:54:37 1.16
--- i386-linux-nat.c 2000/08/29 22:44:38
***************
*** 22,32 ****
#include "inferior.h"
#include "gdbcore.h"
- /* For i386_linux_skip_solib_resolver. */
- #include "symtab.h"
- #include "symfile.h"
- #include "objfiles.h"
-
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/procfs.h>
--- 22,27 ----
***************
*** 794,891 ****
if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
perror_with_name ("ptrace");
- }
-
-
- /* Calling functions in shared libraries. */
- /* FIXME: kettenis/2000-03-05: Doesn't this belong in a
- target-dependent file? The function
- `i386_linux_skip_solib_resolver' is mentioned in
- `config/i386/tm-linux.h'. */
-
- /* 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)
- {
- 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
- i386_linux_skip_solib_resolver (CORE_ADDR pc)
- {
- CORE_ADDR result;
-
- /* Plug in functions for other kinds of resolvers here. */
- result = skip_hurd_resolver (pc);
- if (result)
- return result;
-
- return 0;
}
--- 789,794 ----
Index: i386-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-tdep.c,v
retrieving revision 1.1
diff -c -r1.1 i386-linux-tdep.c
*** i386-linux-tdep.c 2000/03/20 20:38:22 1.1
--- i386-linux-tdep.c 2000/08/29 22:44:38
***************
*** 23,28 ****
--- 23,33 ----
#include "frame.h"
#include "value.h"
+ /* For i386_linux_skip_solib_resolver. */
+ #include "symtab.h"
+ #include "symfile.h"
+ #include "objfiles.h"
+
/* Recognizing signal handler frames. */
***************
*** 278,281 ****
--- 283,374 ----
return i386_linux_sigtramp_saved_pc (frame);
return read_memory_integer (read_register (SP_REGNUM), 4);
+ }
+
+
+
+ /* Calling functions in shared libraries. */
+ /* 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)
+ {
+ 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
+ i386_linux_skip_solib_resolver (CORE_ADDR pc)
+ {
+ CORE_ADDR result;
+
+ /* Plug in functions for other kinds of resolvers here. */
+ result = skip_hurd_resolver (pc);
+ if (result)
+ return result;
+
+ return 0;
}