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.
This commit is contained in:
Tristan Gingold 2011-09-22 10:22:28 +00:00
parent 7cf3bbff36
commit e69860f1b6
8 changed files with 65 additions and 8 deletions

View 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

View 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))

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

View 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);

View 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);

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

View 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);

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