我理解调用execve
将完全擦除调用程序的文本,数据,bss和堆栈,并将其替换为被调用程序的文本,数据,bss和堆栈。
我的问题是:
如果我们将在堆上分配的char
数组作为其参数之一传递给execve
会发生什么? char *
本身驻留在堆栈上,但所有单个chars
都在堆上。难道不会擦除这些数据吗?新计划将如何收到其论点?
答案 0 :(得分:4)
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;