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

Ric*_*ard 2 c operating-system elf

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

感谢您的帮助!

Lui*_*ado 5

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

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

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

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

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