argc,argv,envp的内存布局

时间:2014-05-12 01:27:45

标签: c linux

根据我的理解,环境变量的值直接在以NULL结尾的argv值之后存储在内存中。除了env变量之外,还存在auxv

环境变量究竟是如何布局的 - 指定/记录此布局的位置?它适用于哪些系统?

1 个答案:

答案 0 :(得分:6)

一个简单的答案是:程序调用的堆栈布局由二进制格式定义(例如ELF规范:http://refspecs.linuxbase.org/elf/abi386-4.pdf定义,请参阅图3-31,了解{{}上的初始堆栈布局1}})。

由于Linux不仅限于ELF可执行文件,并且可以使用其exec解释器框架支持多种二进制格式,因此binfmt / argv数据的实际处理分两个阶段进行。< / p>

首先,当调用envp系统调用时,内核将为新进程堆栈创建虚拟内存映射。然后它将使用堆栈底部的一个或几个页面(最多32页任意限制)来存储所提供的sys_execve / argv参数的副本:

envp

http://code.metager.de/source/xref/linux/stable/fs/exec.c#1502

在第二阶段,bprm->exec = bprm->p; retval = copy_strings(bprm->envc, envp, bprm); if (retval < 0) goto out; retval = copy_strings(bprm->argc, argv, bprm); if (retval < 0) goto out; 对象被传递给bprm解释器(以及相关的内存映射)。除了其他内容之外,解释器还会将其他信息推送到堆栈,包括参数/环境条目计数和指针。对于elf可执行文件,它将在binfmt

中发生
create_elf_tables

http://code.metager.de/source/xref/linux/stable/fs/binfmt_elf.c#293

这里的翻译实际上是在上面链接的规范中构建图3-31中概述的结构。