*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-low.c
index fb8002088efb035a4abc8754b8c7fb809d7892a5..c88c0c3eb2f85dddf6ce4be5bdedf1d45a21b58a 100644 (file)
@@ -34,6 +34,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/syscall.h>
+#include <sched.h>
 
 #ifndef PTRACE_GETSIGINFO
 # define PTRACE_GETSIGINFO 0x4202
@@ -1732,14 +1733,20 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
 
 static int linux_supports_tracefork_flag;
 
-/* A helper function for linux_test_for_tracefork, called after fork ().  */
+/* Helper functions for linux_test_for_tracefork, called via clone ().  */
 
-static void
-linux_tracefork_child (void)
+static int
+linux_tracefork_grandchild (void *arg)
+{
+  _exit (0);
+}
+
+static int
+linux_tracefork_child (void *arg)
 {
   ptrace (PTRACE_TRACEME, 0, 0, 0);
   kill (getpid (), SIGSTOP);
-  fork ();
+  clone (linux_tracefork_grandchild, arg, CLONE_VM | SIGCHLD, NULL);
   _exit (0);
 }
 
@@ -1767,15 +1774,15 @@ linux_test_for_tracefork (void)
 {
   int child_pid, ret, status;
   long second_pid;
+  char *stack = malloc (8192);
 
   linux_supports_tracefork_flag = 0;
 
-  child_pid = fork ();
+  /* Use CLONE_VM instead of fork, to support uClinux (no MMU).  */
+  child_pid = clone (linux_tracefork_child, stack + 2048,
+                    CLONE_VM | SIGCHLD, stack + 6144);
   if (child_pid == -1)
-    perror_with_name ("fork");
-
-  if (child_pid == 0)
-    linux_tracefork_child ();
+    perror_with_name ("clone");
 
   ret = my_waitpid (child_pid, &status, 0);
   if (ret == -1)
@@ -1840,6 +1847,8 @@ linux_test_for_tracefork (void)
       my_waitpid (child_pid, &status, 0);
     }
   while (WIFSTOPPED (status));
+
+  free (stack);
 }
 
 
This page took 0.024942 seconds and 4 git commands to generate.