argc、argv、envp的内存布局

2024-04-03

据我了解,环境变量的值直接在内存中以 NULL 结尾argv价值观。除了环境变量之外,auxv存在。

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


一个简单的答案是:程序调用时堆栈的布局由二进制格式定义(例如 ELF 规范:http://refspecs.linuxbase.org/elf/abi386-4.pdf 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 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 http://code.metager.de/source/xref/linux/stable/fs/binfmt_elf.c#293)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

argc、argv、envp的内存布局 的相关文章

  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 我们如何检查表是否有索引?

    我们如何检查该表是否有索引 如果有如何找到表的特定列的索引 问候 库马尔 在 SQL Server Management Studio 中 您可以沿着树导航到您感兴趣的表并打开索引节点 双击该节点中的任何索引将打开属性对话框 其中将显示索引
  • 图像上沿折线/曲线的点的有序列表

    我有一些带有折线 多重曲线组合的图像 我的目标是恢复沿着这些折线 多重曲线的点的有序列表 使用 opencv ConnectedComponents 我可以隔离图像中的每条折线 曲线 然后尝试通过以下步骤获取有序的点序列 num label
  • With 函数中的多个对象表达式循环遍历所有工作表

    我有一个由两张表组成的 Excel 电子表格 Sheet1 and Sheet2 在每张纸上我都有一个Button 1 为了将此按钮移动到Range D9 E11 在两张表中 我使用以下 VBA 来引用解决方案here https stac
  • Angular 2 找不到我的功能模块中声明的组件

    我很难让模块在 Angular 2 中工作 我创造了a plunk http plnkr co edit gJup4zH7v4CoFNC8k5kZ p preview这说明了问题所在 在 plunk 中 您会看到我有 app module
  • 如何将文本附加到 d3.js 中的一行

    我正在尝试将文本附加到条形图上创建的线条中 问题是我可以看到文本元素已创建 但它没有显示在 svg 上的任何地方 我附加文本的代码部分 var line svg append line attr x1 function return x l
  • 是否可以在 Android 设备上运行容器?

    我是一名移动开发人员 最近擅长使用 docker 容器 我正在为我的研究生项目开发容器架构 该架构的模块之一需要在 Android 设备上运行 但我找不到有关如何在 Android 设备上运行容器的信息 它可以是一些简单的东西 比如用 py
  • 计算硬盘吞吐量

    我的应用程序创建了一个 2GB 文件 需要选择系统上速度最快且有足够空间的驱动器 我尝试通过创建文件 设置长度 然后按顺序向其中写入数据来计算吞吐量 如下所示 FileInfo file null var drives DriveInfo
  • PIL:将模式“I”的图像转换为“RGB”会产生全白图像

    据我所知 这个问题末尾的图像是模式 I 的 PNG 它代表 索引 我正在尝试创建一个缩略图 并使用 PIL 将其保存为 JPG 然而 我是否离开了mode独自一人 PIL 不会让我错误地调整它的大小unable to generate th
  • iloc 给出“IndexError:单个位置索引器超出范围”

    我正在尝试使用以下内容对一些信息进行编码以读入机器学习模型 import numpy as np import pandas as pd import matplotlib pyplot as py Dataset pd read csv
  • 当子模块存在时,Git diffing 在 Windows 上崩溃

    Using msysgit http code google com p msysgit 在窗户上 每当我这样做时git diff在具有一个或多个子模块的存储库上 命令提示符 以及 PowerShell 崩溃 这是已知的 但是有修复 解决方
  • AFNetworking 返回 NSCFData; registerHTTPOperationClass 的问题[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我是 AF
  • php sprintf() 包含外来字符?

    接缝就像 sprintf 有外来字符的问题 还是我做错了什么 看起来它在从字符串中删除像 这样的字符时有效 有必要吗 我希望以下几行能够正确对齐以生成报告 2011 11 27 A1823 Ref Leif 12 873 00 18 98
  • git clone,忽略目录

    我正在尝试在 WordPress 安装上测试一些东西 这样做时 我想快速复制该存储库 但是 上传目录 wp content uploads 很大 所以我想忽略它 注意 我不想一直 gitignore 这个目录 只是为了这个场景 基本上 我想
  • Bash 测试中的复合条件组[重复]

    这个问题在这里已经有答案了 我想在 Bash 中设置一些条件组if陈述 具体来说 我正在寻找类似以下内容的内容 if
  • 下载源代码时 AWS Codebuild 失败。消息:找不到参考

    当使用 git 标签作为源版本触发构建时 使用 AWS Codebuild 正常运行数月的 CI CD 管道突然开始失败 通过拉取请求 pr 触发的构建继续正常工作 任何帮助将非常感激 我在 CodeBuild 团队工作 我们已经回滚了可能
  • php ftp 建立多个目录

    这是我的 PHP 代码 它实际上工作得很好 newftpdir parent date Ymd YYYYMMDD newftpdir child ext folder username newftpdir newftpdir parent
  • FFMPEG:合并音频(.mp3)和单个图像将它们转换为视频

    我想合并 IMAGE AUDIO 并使用 FFMPEG 库将它们转换为视频 我成功编译了该库 并得到了 libfmpeg so 但是通过 java 代码执行 ffmpeg 命令时出现问题 这是我正在使用的命令 ffmpeg i image8
  • PHP 中多行注释内的多行注释

    PHP 返回 语法错误 这是否是使用多行注释的完全错误的方法 有时我需要注释掉一大块代码进行测试 而这个代码块包含数百行 并且里面有很多多行注释 注释掉这个大块的最佳方法是什么 除了暂时从文件中删除它之外 来自PHP手册 http php
  • XML 与逗号分隔的文本文件

    好吧 我读了几本关于 XML 的书 并编写了程序来吐出它 等等 但问题是这样的 逗号分隔文件和 XML 文件都是 人类可读的 但总的来说 逗号分隔文件比 XML 文件更容易被我看到 标签通常占用与数据一样多的空间 甚至更多 这似乎掩盖了我正
  • argc、argv、envp的内存布局

    据我了解 环境变量的值直接在内存中以 NULL 结尾argv价值观 除了环境变量之外 auxv存在 环境变量到底是如何布局的 这个布局在哪里指定 记录 以及它适用于哪些系统 一个简单的答案是 程序调用时堆栈的布局由二进制格式定义 例如 EL