This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[RFA] Linux: move solib code from native to target module.


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;
  }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]