Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [KLUDGE PATCH] Linux vsyscall DSO support
@ 2004-04-08 21:09 Roland McGrath
  2004-04-08 21:30 ` Andrew Cagney
  0 siblings, 1 reply; 4+ messages in thread
From: Roland McGrath @ 2004-04-08 21:09 UTC (permalink / raw)
  To: gdb-patches

Perhaps you recall the discussion here some months back about what hook to
use in Linux targets for the detection of the vsyscall DSO.  The last time
I asked here about a resolution on how best to do this, I got no feedback.
I hope we can now jumpstart the effort to find the right way to implement
this.  To get things rolling again, here is a patch that I am not
suggesting for inclusion, but does work.  This is a kludge to overload the
solib hooks with target-specific code.  These solib hooks get called at
roughly (or perhaps even precisely?) the correct places where the vsyscall
DSO checks ought to happen.  A reminder, the appropriate places are when
gdb thinks the address space might be a fresh layout from what it knows,
i.e. first attach (or any attach?), after exec, and on opening a core file.

As I said, this code works for me.  (It requires symbol_file_add_from_memory,
which is in the patch I just re-posted.)  It seems doubtful this is the
ultimately desireable approach to wedging this code in where needs to be.
But it's what I've got, and as I said I'm still waiting for more feedback to
conclude on exactly what the preferred better thing to do is.


Thanks,
Roland


2003-10-09  Roland McGrath  <roland@redhat.com>

	* solib.c (do_clear_solib): Use CLEAR_SOLIB macro instead of
	clear_solib function, so that a target macro can override the defn.
	* linux-tdep.c: New file.
	* Makefile.in (linux-tdep.o): New target.
	(ALLDEPFILES): Add it.
	* config/i386/linux.mt (TDEPFILES): Likewise.
	* config/ia64/linux.mt (TDEPFILES): Likewise.
	* config/s390/s390x.mt (TDEPFILES): Likewise.
	* config/sh/linux.mt (TDEPFILES): Likewise.
	* config/mips/linux.mt (TDEPFILES): Likewise.
	* config/s390/s390.mt (TDEPFILES): Likewise.
	* config/arm/linux.mt (TDEPFILES): Likewise.
	* config/m68k/linux.mt (TDEPFILES): Likewise.
	* config/sparc/linux.mt (TDEPFILES): Likewise.
	* config/powerpc/linux.mt (TDEPFILES): Likewise.

Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.64
diff -b -p -u -r1.64 solib.c
--- solib.c	11 Mar 2004 17:04:40 -0000	1.64
+++ solib.c	8 Apr 2004 20:50:50 -0000
@@ -778,7 +778,7 @@ static void
 do_clear_solib (void *dummy)
 {
   solib_cleanup_queued = 0;
-  clear_solib ();
+  CLEAR_SOLIB ();		/* Let tm.h override.  */
 }
 
 /* GLOBAL FUNCTION
Index: linux-tdep.c
===================================================================
RCS file: linux-tdep.c
diff -N linux-tdep.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ linux-tdep.c	8 Apr 2004 20:50:50 -0000
@@ -0,0 +1,39 @@
+#include "defs.h"
+#include "solib.h"
+#include "symtab.h"
+#include "symfile.h"
+#include "objfiles.h"
+#include "target.h"
+
+#include <elf/common.h>
+#include "auxv.h"
+
+static int checked_inferior_sysinfo;
+
+void
+linux_solib_add (char *pattern, int from_tty,
+		 struct target_ops *target, int readsyms)
+{
+  if (!checked_inferior_sysinfo)
+    {
+      extern bfd *core_bfd, *exec_bfd;
+      CORE_ADDR sysinfo_ehdr;
+
+      if (target_auxv_search (target, AT_SYSINFO_EHDR, &sysinfo_ehdr) > 0
+	  && sysinfo_ehdr != (CORE_ADDR) 0)
+	(void) symbol_file_add_from_memory
+	  (core_bfd != NULL ? core_bfd : exec_bfd, sysinfo_ehdr, from_tty);
+
+      checked_inferior_sysinfo = 1;
+    }
+
+  solib_add (pattern, from_tty, target, readsyms);
+}
+
+void
+linux_clear_solib (void)
+{
+  clear_solib ();
+
+  checked_inferior_sysinfo = 0;
+}
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.534
diff -b -p -u -r1.534 Makefile.in
--- Makefile.in	7 Apr 2004 00:04:28 -0000	1.534
+++ Makefile.in	8 Apr 2004 20:50:52 -0000
@@ -1330,6 +1330,7 @@ ALLDEPFILES = \
 	i386gnu-nat.c i386gnu-tdep.c \
 	ia64-linux-nat.c ia64-linux-tdep.c ia64-tdep.c \
 	infptrace.c inftarg.c irix4-nat.c irix5-nat.c \
+	linux-tdep.c \
 	libunwind-frame.c \
 	lynx-nat.c m3-nat.c \
 	m68hc11-tdep.c \
@@ -1972,6 +1973,8 @@ linux-nat.o: linux-nat.c $(defs_h) $(inf
 linux-proc.o: linux-proc.c $(defs_h) $(inferior_h) $(gdb_stat_h) \
 	$(regcache_h) $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(elf_bfd_h) \
 	$(cli_decode_h) $(gdb_string_h) $(linux_nat_h)
+linux-tdep.o: linux-tdep.c $(defs_h) $(solib_h) $(symtab_h) $(symfile_h) \
+	$(objfiles_h) $(target_h)  $(elf_external_h) $(elf_common_h)
 lynx-nat.o: lynx-nat.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \
 	$(gdbcore_h) $(regcache_h)
 m2-exp.o: m2-exp.c $(defs_h) $(gdb_string_h) $(expression_h) $(language_h) \
Index: config/arm/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/linux.mt,v
retrieving revision 1.7
diff -b -p -u -r1.7 linux.mt
--- config/arm/linux.mt	9 Nov 2003 17:28:07 -0000	1.7
+++ config/arm/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,3 +1,3 @@
 # Target: ARM based machine running GNU/Linux
 TM_FILE= tm-linux.h
-TDEPFILES= arm-tdep.o arm-linux-tdep.o glibc-tdep.o solib.o solib-svr4.o solib-legacy.o
+TDEPFILES= linux-tdep.o arm-tdep.o arm-linux-tdep.o glibc-tdep.o solib.o solib-svr4.o solib-legacy.o
Index: config/i386/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/linux.mt,v
retrieving revision 1.7
diff -b -p -u -r1.7 linux.mt
--- config/i386/linux.mt	9 Nov 2003 17:28:08 -0000	1.7
+++ config/i386/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,4 +1,5 @@
 # Target: Intel 386 running GNU/Linux
-TDEPFILES= i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
+TDEPFILES= linux-tdep.o \
+	   i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
 	solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
Index: config/ia64/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/ia64/linux.mt,v
retrieving revision 1.8
diff -b -p -u -r1.8 linux.mt
--- config/ia64/linux.mt	20 Jun 2003 13:57:29 -0000	1.8
+++ config/ia64/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,4 +1,4 @@
 # Target: Intel IA-64 running GNU/Linux
-TDEPFILES= ia64-tdep.o ia64-aix-tdep.o ia64-linux-tdep.o \
+TDEPFILES= linux-tdep.o ia64-tdep.o ia64-aix-tdep.o ia64-linux-tdep.o \
 	solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
Index: config/m68k/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/linux.mt,v
retrieving revision 1.4
diff -b -p -u -r1.4 linux.mt
--- config/m68k/linux.mt	19 Nov 2002 23:14:45 -0000	1.4
+++ config/m68k/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,3 +1,4 @@
 # Target: Motorola m68k with a.out and ELF
-TDEPFILES= m68k-tdep.o m68klinux-tdep.o solib.o solib-svr4.o solib-legacy.o
+TDEPFILES= linux-tdep.o m68k-tdep.o m68klinux-tdep.o \
+	   solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
Index: config/mips/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/mips/linux.mt,v
retrieving revision 1.3
diff -b -p -u -r1.3 linux.mt
--- config/mips/linux.mt	20 Jun 2003 13:57:29 -0000	1.3
+++ config/mips/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,5 +1,5 @@
 # Target: Linux/MIPS
-TDEPFILES= mips-tdep.o mips-linux-tdep.o corelow.o \
+TDEPFILES= linux-tdep.o mips-tdep.o mips-linux-tdep.o corelow.o \
 	solib.o solib-svr4.o
 TM_FILE= tm-linux.h
 
Index: config/powerpc/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/powerpc/linux.mt,v
retrieving revision 1.6
diff -b -p -u -r1.6 linux.mt
--- config/powerpc/linux.mt	30 Jul 2002 19:03:49 -0000	1.6
+++ config/powerpc/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,6 +1,6 @@
 # Target: Motorola PPC on Linux
-TDEPFILES= rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o solib.o \
-	solib-svr4.o solib-legacy.o corelow.o
+TDEPFILES= linux-tdep.o rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o \
+	   solib.o solib-svr4.o solib-legacy.o corelow.o
 TM_FILE= tm-linux.h
 
 SIM_OBS = remote-sim.o
Index: config/sh/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/sh/linux.mt,v
retrieving revision 1.6
diff -b -p -u -r1.6 linux.mt
--- config/sh/linux.mt	10 Oct 2003 07:13:11 -0000	1.6
+++ config/sh/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,5 +1,7 @@
 # Target: Renesas Super-H running GNU/Linux
-TDEPFILES= sh-tdep.o sh64-tdep.o monitor.o sh3-rom.o remote-e7000.o ser-e7kpc.o dsrec.o solib.o solib-svr4.o solib-legacy.o
+TDEPFILES= linux-tdep.o sh-tdep.o sh64-tdep.o \
+	   monitor.o sh3-rom.o remote-e7000.o ser-e7kpc.o dsrec.o \
+	   solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
 
 SIM_OBS = remote-sim.o
Index: config/sparc/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/linux.mt,v
retrieving revision 1.5
diff -b -p -u -r1.5 linux.mt
--- config/sparc/linux.mt	7 Apr 2004 00:15:12 -0000	1.5
+++ config/sparc/linux.mt	8 Apr 2004 20:50:52 -0000
@@ -1,4 +1,4 @@
 # Target: GNU/Linux SPARC
 TDEPFILES= sparc-tdep.o sparc-sol2-tdep.o sparc-linux-tdep.o \
-	solib.o solib-svr4.o
+	solib.o solib-svr4.o linux-tdep.o
 TM_FILE= tm-linux.h


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-04-22  0:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-08 21:09 [KLUDGE PATCH] Linux vsyscall DSO support Roland McGrath
2004-04-08 21:30 ` Andrew Cagney
2004-04-08 22:13   ` Roland McGrath
2004-04-22  0:18     ` Andrew Cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox