gpt4 book ai didi

c - argc、argv、envp的内存布局

转载 作者:可可西里 更新时间:2023-11-01 11:46:09 29 4
gpt4 key购买 nike

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

环境变量究竟是如何布局的——这个布局是在哪里指定/记录的?它适用于哪些系统?

最佳答案

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

由于 Linux 不限于 ELF 可执行文件,并且可以使用其 binfmt 支持多种二进制格式解释器框架,实际处理argv/envp数据发生在两个阶段。

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

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;

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

在第二阶段,bprm对象被传递给 binfmt解释器(连同相关的内存映射)。除其他事项外,解释器会将其他信息推送到堆栈,包括参数/环境条目计数和指针。对于 elf 可执行文件,它将发生在 create_elf_tables 中。 :

/* Now, let's put argc (and argv, envp if appropriate) on the stack */
if (__put_user(argc, sp++))
return -EFAULT;
argv = sp;
envp = argv + argc + 1;

/* Populate argv and envp */
p = current->mm->arg_end = current->mm->arg_start;
while (argc-- > 0) {...

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

此处的解释器实际上正在构建上面链接的规范中图 3-31 中概述的结构。

关于c - argc、argv、envp的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599762/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com