gpt4 book ai didi

c - 一个程序如何知道bss段所在的位置

转载 作者:行者123 更新时间:2023-12-04 11:59:59 28 4
gpt4 key购买 nike

据我所知,x86 有专门的寄存器用于指向代码段、数据段和堆栈段的指针,但没有 bss 段和堆段。计算机如何记住这些段的位置?尤其是heap,因为bss直接在data之后,但是heap经常放在内存的不同地方。

最佳答案

堆通常由与您的代码(静态或动态)链接的 C runtine 创建。它在虚拟地址中确定一个地址,调用操作系统提供的系统调用来映射页面,并将该地址存储在一些数据结构中,该数据结构被 malloc(和函数族)用作堆。所有这些代码要么在调用 main 之前执行,要么在二进制文件中静态初始化。

至于 bss 部分,如您所知,它是全零填充的。二进制文件包含有关 .bss 部分的大小和基地址的信息。加载器将页面映射到这个虚拟地址并用零清除它们(以一种有效的方式)。

如果在 Windows 上,您可以通过运行 dumpbin/HEADERS binary.exe 查看 bss 段的地址及其大小。在 Linux 上,您可以使用 objdump。我相信所需的标志是 -x

关于你的问题,如果偏移量在指令中硬编码,它们如何移动 -

二进制文件还有一个称为重定位表的表,其中包含访问特定部分上这些值的所有指令的地址。加载程序可能会决定将段放在其他地方(通常发生在您在 Linux 中加载多个 dll 或共享库时)。在那种情况下,它会修补所有查看重定位表的指令。它实际上改变了指令中的偏移量。这是由加载程序在执行 main 之前完成的。

当然这是有开销的,只有在重定位信息可用的情况下才能完成。某些二进制文件可能会选择省略重定位表,在这种情况下,如果该部分无法放置在指定位置,二进制文件将无法加载。

希望这能消除一些困惑。

关于c - 一个程序如何知道bss段所在的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43897051/

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