【发布时间】:2016-02-14 20:02:17
【问题描述】:
我知道调用execve会彻底清除调用程序的文本、数据、bss和堆栈,并用被调用程序的替换。
我的问题是这样的:
如果我们将分配在堆上的char 数组作为参数之一传递给execve,会发生什么? char * 本身驻留在堆栈上,但所有单独的 chars 都在堆上。 execve 不会擦除这些数据吗?新程序将如何接收它的参数?
【问题讨论】:
我知道调用execve会彻底清除调用程序的文本、数据、bss和堆栈,并用被调用程序的替换。
我的问题是这样的:
如果我们将分配在堆上的char 数组作为参数之一传递给execve,会发生什么? char * 本身驻留在堆栈上,但所有单独的 chars 都在堆上。 execve 不会擦除这些数据吗?新程序将如何接收它的参数?
【问题讨论】:
execve 系统调用将复制 args 并将它们放在新程序的地址空间中。
您可以在此处的第 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;
【讨论】:
copy_strings() 函数从我包含的那个链接中的第 454 行开始——这是一个非常复杂的函数。