summaryrefslogtreecommitdiff
path: root/src/strace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/strace.c')
-rw-r--r--src/strace.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/strace.c b/src/strace.c
index 265c0c6dc..85d69485f 100644
--- a/src/strace.c
+++ b/src/strace.c
@@ -186,6 +186,8 @@ static size_t tcb_wait_tab_size;
char *program_invocation_name;
#endif
+char *argv0; /* override argv[0] on execve */
+
unsigned os_release; /* generated from uname()'s u.release */
static void detach(struct tcb *tcp);
@@ -303,6 +305,7 @@ Startup:\n\
trace process with process id PID, may be repeated\n\
-u USERNAME, --user=USERNAME\n\
run command as USERNAME handling setuid and/or setgid\n\
+ --argv0=NAME set PROG argv[0] to NAME\n\
\n\
Tracing:\n\
-b execve, --detach-on=execve\n\
@@ -1675,6 +1678,8 @@ startup_child(char **argv, char **env)
params_for_tracee.run_euid = (statbuf.st_mode & S_ISUID) ? statbuf.st_uid : run_uid;
params_for_tracee.run_egid = (statbuf.st_mode & S_ISGID) ? statbuf.st_gid : run_gid;
params_for_tracee.argv = argv;
+ if (argv0)
+ params_for_tracee.argv[0] = argv0;
params_for_tracee.env = env;
/*
* On NOMMU, can be safely freed only after execve in tracee.
@@ -2266,6 +2271,7 @@ init(int argc, char *argv[])
GETOPT_SYSCALL_LIMIT,
GETOPT_TS,
GETOPT_TIPS,
+ GETOPT_ARGV0,
GETOPT_QUAL_TRACE,
GETOPT_QUAL_TRACE_FD,
@@ -2327,6 +2333,7 @@ init(int argc, char *argv[])
{ "failing-only", no_argument, 0, 'Z' },
{ "seccomp-bpf", no_argument, 0, GETOPT_SECCOMP },
{ "tips", optional_argument, 0, GETOPT_TIPS },
+ { "argv0", required_argument, 0, GETOPT_ARGV0 },
{ "trace", required_argument, 0, GETOPT_QUAL_TRACE },
{ "trace-fds", required_argument, 0, GETOPT_QUAL_TRACE_FD },
@@ -2564,6 +2571,9 @@ init(int argc, char *argv[])
if (parse_tips_arg(optarg ?: ""))
error_opt_arg(c, lopt, optarg);
break;
+ case GETOPT_ARGV0:
+ argv0 = optarg;
+ break;
case GETOPT_QUAL_SECONTEXT:
qualify_secontext(optarg ? optarg : secontext_qual);
break;
@@ -2634,6 +2644,9 @@ init(int argc, char *argv[])
error_msg_and_help("must have PROG [ARGS] or -p PID");
}
+ if (!argc && argv0)
+ error_msg_and_help("PROG [ARGS] must be specified with --argv0");
+
if (daemonized_tracer_long) {
if (daemonized_tracer) {
error_msg_and_die("-D and --daemonize cannot"