gpt4 book ai didi

c - 为什么对象 (ELF) 文件中的 .bss 部分没有内容?

转载 作者:行者123 更新时间:2023-12-02 08:08:49 25 4
gpt4 key购买 nike

这个问题让我很困惑。据我所知, .bss 部分用于保存已初始化但尚未使用的数据。但是我不明白这里的“内容”是什么意思,为什么这里没有内容?

感谢您的帮助!

最佳答案

快速的 react 是:好吧,没有内容可以填充 .bss,因此将任何数据放在与该部分相关的可执行文件中是没有意义的。仅存储变量的位置,但属于另一个 ELF 部分。

.bss 部分是你程序中所有未初始化变量的位置(默认情况下全部初始化为零)链接器只需要知道这个区域的实际大小和实际变量位置,但不需要值,因为它的内容是显而易见的,独立于放置在那里的变量的性质或分布。

当您的程序被加载时,内核通常会为程序的不可修改文本分配一个只读段(.text 部分),并将初始化的 的内容放入该段>const 变量(.rodata 部分)所以如果你试图在那里修改某些东西,你会得到一个异常。然后是初始化数据部分,其中包含程序所有已初始化变量的初始值(.data 部分)和未初始化的变量(.bss 部分)

数据段(看我如何称呼不同的段和加载段)被赋予更多空间,.data.bss 段的总和,用于保存所有变量(都包含在内,所以这就是它使用其长度的原因)但是 .data 部分的内容必须从文件中填充,.bss 的内容 部分不要,因为在允许用户进程访问分配的段之前,所有内容都由操作系统清零。对于小型系统而言,情况并非如此,操作系统不会用零填充数据......但是在那里,编译器添加了一些代码以将所有 .bss 段归零,所以同样,没有需要从可执行文件复制任何数据。

这种行为的历史(和主要)原因是内核分配的页面必须与您的程序一起加载,出于安全原因被清除为零(因此您不能幸运地获得充满其他用户密码的页面, 或其他明智的信息)所以没有理由再次用零填充它并且没有任何东西必须复制到那里,没有理由在可执行文件上放置任何东西。内核维护的页面通常仅在将要提供给用户时才清零,但会保留(因为它们是为此目的而设计的)信息,直到它们被覆盖。

关于c - 为什么对象 (ELF) 文件中的 .bss 部分没有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48954046/

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