传递给 execve 的参数会怎样?

What happens to the arguments passed to execve?

我明白调用execve会彻底擦除调用程序的文本、数据、bss和堆栈,并替换为被调用程序的内容。

我的问题是:

如果我们将在堆上分配的 char 数组作为其参数之一传递给 execve 会发生什么情况? char * 本身驻留在堆栈上,但所有单独的 chars 都在堆上。不会执行擦除这些数据吗?新程序将如何接收其参数?

execve 系统调用将复制 args 并将它们放入新程序的地址 space。

你可以在第 1586 行看到这个

1581         bprm->exec = bprm->p;
1582         retval = copy_strings(bprm->envc, envp, bprm);
1583         if (retval < 0)
1584                 goto out;
1585 
1586         retval = copy_strings(bprm->argc, argv, bprm);
1587         if (retval < 0)
1588                 goto out;
1589 
1590         retval = exec_binprm(bprm);
1591         if (retval < 0)
1592                 goto out;

(来自http://lxr.free-electrons.com/source/fs/exec.c