2011-09-22 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Thu, 22 Sep 2011 10:22:28 +0000 (10:22 +0000)
committerTristan Gingold <gingold@adacore.com>
Thu, 22 Sep 2011 10:22:28 +0000 (10:22 +0000)
* fork-child.c (fork_inferior): Add exec_fun parameter.
Call exec_fun or execvp.
* inferior.h: Adjust prototype.
* gnu-nat.c (gnu_create_inferior): Adjust fork_inferior call.
* inf-ttrace.c (inf_ttrace_create_inferior): Ditto.
* inf-ptrace.c (inf_ptrace_create_inferior): Ditto.
* procfs.c (procfs_create_inferior): Ditto.
* darwin-nat.c (darwin_execvp): New function.
(darwin_create_inferior): Use it.

gdb/ChangeLog
gdb/darwin-nat.c
gdb/fork-child.c
gdb/gnu-nat.c
gdb/inf-ptrace.c
gdb/inf-ttrace.c
gdb/inferior.h
gdb/procfs.c

index 058fd0f48cc1fd8f3647554a9e55d59bb0386b86..4dbb6c1c53476386888abe5414673091a5db942c 100644 (file)
@@ -1,3 +1,15 @@
+2011-09-22  Tristan Gingold  <gingold@adacore.com>
+
+       * fork-child.c (fork_inferior): Add exec_fun parameter.
+       Call exec_fun or execvp.
+       * inferior.h: Adjust prototype.
+       * gnu-nat.c (gnu_create_inferior): Adjust fork_inferior call.
+       * inf-ttrace.c (inf_ttrace_create_inferior): Ditto.
+       * inf-ptrace.c (inf_ptrace_create_inferior): Ditto.
+       * procfs.c (procfs_create_inferior): Ditto.
+       * darwin-nat.c (darwin_execvp): New function.
+       (darwin_create_inferior): Use it.
+
 2011-09-22  Yao Qi  <yao@codesourcery.com>
 
        * infrun.c (context_switch): Print debug message when switching to
index 06a155856482582d9b226e86c46977229e297eeb..7c0ff5b8757cf1311dc00af000332b7d98bb6e52 100644 (file)
@@ -53,6 +53,7 @@
 #include <sys/proc.h>
 #include <libproc.h>
 #include <sys/syscall.h>
+#include <spawn.h>
 
 #include <mach/mach_error.h>
 #include <mach/mach_vm.h>
@@ -1506,13 +1507,48 @@ darwin_ptrace_him (int pid)
   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
 }
 
+static void
+darwin_execvp (const char *file, char * const argv[], char * const env[])
+{
+  posix_spawnattr_t attr;
+  short ps_flags = 0;
+  int retval;
+
+  retval = posix_spawnattr_init (&attr);
+  if (retval != 0)
+    {
+      fprintf_unfiltered
+        (gdb_stderr, "Cannot initialize attribute for posix_spawn\n");
+      return;
+    }
+
+  /* Do like execve: replace the image.  */
+  ps_flags = POSIX_SPAWN_SETEXEC;
+
+  /* Disable ASLR.  The constant doesn't look to be available outside the
+     kernel include files.  */
+#ifndef _POSIX_SPAWN_DISABLE_ASLR
+#define _POSIX_SPAWN_DISABLE_ASLR 0x0100
+#endif
+  ps_flags |= _POSIX_SPAWN_DISABLE_ASLR;
+  retval = posix_spawnattr_setflags (&attr, ps_flags);
+  if (retval != 0)
+    {
+      fprintf_unfiltered
+        (gdb_stderr, "Cannot set posix_spawn flags\n");
+      return;
+    }
+
+  posix_spawnp (NULL, argv[0], NULL, &attr, argv, env);
+}
+
 static void
 darwin_create_inferior (struct target_ops *ops, char *exec_file,
                        char *allargs, char **env, int from_tty)
 {
   /* Do the hard work.  */
   fork_inferior (exec_file, allargs, env, darwin_ptrace_me, darwin_ptrace_him,
-                darwin_pre_ptrace, NULL);
+                darwin_pre_ptrace, NULL, darwin_execvp);
 
   /* Return now in case of error.  */
   if (ptid_equal (inferior_ptid, null_ptid))
index 5dbf1f750fbe5d167edcc162699d901030608a19..e6408f49558fa8f7bb7fb268a41281e8a9e514cc 100644 (file)
@@ -115,6 +115,7 @@ escape_bang_in_quoted_argument (const char *shell_file)
    pid.  EXEC_FILE is the file to run.  ALLARGS is a string containing
    the arguments to the program.  ENV is the environment vector to
    pass.  SHELL_FILE is the shell file, or NULL if we should pick
+   one.  EXEC_FUN is the exec(2) function to use, or NULL for the default
    one.  */
 
 /* This function is NOT reentrant.  Some of the variables have been
@@ -123,7 +124,9 @@ escape_bang_in_quoted_argument (const char *shell_file)
 int
 fork_inferior (char *exec_file_arg, char *allargs, char **env,
               void (*traceme_fun) (void), void (*init_trace_fun) (int),
-              void (*pre_trace_fun) (void), char *shell_file_arg)
+              void (*pre_trace_fun) (void), char *shell_file_arg,
+               void (*exec_fun)(const char *file, char * const *argv,
+                                char * const *env))
 {
   int pid;
   static char default_shell_file[] = SHELL_FILE;
@@ -359,7 +362,10 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
          path to find $SHELL.  Rich Pixley says so, and I agree.  */
       environ = env;
 
-      execvp (argv[0], argv);
+      if (exec_fun != NULL)
+        (*exec_fun) (argv[0], argv, env);
+      else
+        execvp (argv[0], argv);
 
       /* If we get here, it's an error.  */
       save_errno = errno;
index 72696948c97baa467fb1ea1da144e5d580b70c00..32f78be1b3a2c31b8e21f481e4f2d3f86c5b8408 100644 (file)
@@ -2114,7 +2114,8 @@ gnu_create_inferior (struct target_ops *ops,
 
   inf_debug (inf, "creating inferior");
 
-  pid = fork_inferior (exec_file, allargs, env, trace_me, NULL, NULL, NULL);
+  pid = fork_inferior (exec_file, allargs, env, trace_me,
+                       NULL, NULL, NULL, NULL);
 
   /* Attach to the now stopped child, which is actually a shell...  */
   inf_debug (inf, "attaching to child: %d", pid);
index b5e1744b1faf6721473f23373e8854f2ccf902c1..110e825363e64a2b5d338b14ef20520fcaa0b27f 100644 (file)
@@ -134,7 +134,7 @@ inf_ptrace_create_inferior (struct target_ops *ops,
     }
 
   pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL,
-                      NULL, NULL);
+                      NULL, NULL, NULL);
 
   if (! ops_already_pushed)
     discard_cleanups (back_to);
index ab075db9c4450e67c56d960e36a18e34da0bb34f..0ab65804b9340c5bd6d690b2629966f3d6286d94 100644 (file)
@@ -650,7 +650,7 @@ inf_ttrace_create_inferior (struct target_ops *ops, char *exec_file,
   gdb_assert (inf_ttrace_vfork_ppid == -1);
 
   pid = fork_inferior (exec_file, allargs, env, inf_ttrace_me, NULL,
-                      inf_ttrace_prepare, NULL);
+                      inf_ttrace_prepare, NULL, NULL);
 
   inf_ttrace_him (ops, pid);
 }
index 0815b65e9e1c5275c940d4b7d5b549ec53092113..8aca8dc65227c67181bc9740ee232e6cdb045e07 100644 (file)
@@ -189,7 +189,9 @@ extern void terminal_init_inferior_with_pgrp (int pgrp);
 
 extern int fork_inferior (char *, char *, char **,
                          void (*)(void),
-                         void (*)(int), void (*)(void), char *);
+                         void (*)(int), void (*)(void), char *,
+                          void (*)(const char *,
+                                   char * const *, char * const *));
 
 
 extern void startup_inferior (int);
index 917e122c9a5d9aa40a9e77279ee2d045fd41d193..871dd47ab9d16018bfb84f9dd8f53f04b9c3e1d7 100644 (file)
@@ -4915,7 +4915,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file,
     }
 
   pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
-                      NULL, NULL, shell_file);
+                      NULL, NULL, shell_file, NULL);
 
   procfs_init_inferior (ops, pid);
 }