传递给 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;
我明白调用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;