我在学习时遇到了一些问题。我知道C中未初始化的全局变量被分配给可执行ELF文件中的.bss部分。但是当我开始使用它们时会发生什么? 即他们在堆上还是其他地方找到了一个位置?
我试图通过使用
打印(仍然未初始化的)全局变量的地址来查找printf("%x",&glbl);
总是返回相同的值0x80495bc ...为什么?
答案 0 :(得分:8)
当操作系统加载程序时,它会从程序的地址空间分配足够的存储空间,以便将所有内容存储在.bss部分中,并将所有内存归零。当您分配或读取或获取变量的地址时,您正在操作为.bss部分提供存储而分配的内存。
答案 1 :(得分:2)
全局变量总是获得静态内存,如果它们未初始化,则它们在二进制文件中没有空格,但是当二进制文件加载到进程内存空间时,它们确实将它存入内存。
答案 2 :(得分:1)
BSS是以可执行(或ELF)格式定义的占位符。因此它不占用磁盘空间,而只指定链接器或加载器应分配的内存区域。
确切的操作取决于操作系统。由于您参考ELF,我认为它是用于嵌入式系统。如果构建可ROMmable代码,则链接器cmd文件会将BSS映射到静态地址区域。
如果您为操作系统(即Linux)构建,操作系统中的加载程序将执行重定位传递,其中将以可执行格式标记为相对的所有位置映射到内存中的物理或逻辑位置。 / p>
因为您提到始终看到相同的值,这表示该过程对您的系统是可重复的。当您更改链接器文件(即地址区域),链接顺序(即模块将按不同顺序分配空间)或操作系统时,预计会看到更改。
无论您是否使用BSS值,您运行的流程的地址都将保持不变。
答案 3 :(得分:1)
BSS部分在进程地址空间中给出了一个内存块,就像代码和堆栈部分(以及任何其他ELF可能具有的那样)。在那里,他们不会去任何地方。加载器安排事物然后调用进程入口点。