当前位置:   article > 正文

为什么要把bss段清0_为什么要清零elf文件中的bss断

为什么要清零elf文件中的bss断
全局变量与静态变量没有初始化或初始化值为0时,都会放在.bss段。初始化为非0值,则放在.data段。
全局变量与静态变量没有初始化或初始化值为0时,都放在.bss段会产生一个问题: 假如说我们定义一个全局的变量 int a = 0;我们知道这是一个初始化值为0 的全局变量,那么他会被放在.bss段,由于存储在bss段内的数据在下一次启动代码时不会被自动的重新初始化为0(即bss段清0),这就可能导致上一次运行代码过程中有可能修改了全局变量或静态变量的值,而修改过的值会被bss段保存下来,那么在下一次启动代码事我们定义的那个全局变量的值就可能不是我们第一次定义的 “0”值了,这样的话就有可能导致一些问题。
举个例子:
int a = 0//全局变量,被放在bss段
void main(void)
{
    if(a == 0){
        printf("a=0");
        a = 1;
    }
else{ 
        printf("a != 0 ");
        a = 0;
    }
}
我们第一次运行程序时,是输出:a =  0,第二次再运行就输出:a != 0了,下一次再运行 又输出:a = 0 了,这样就导致同样的代码,在不同次的运行是产生不同的结果,这绝不是我们希望看到的。所以在初始化代码是我们要对bss段清0。这样每次运行是为初始化的全局变量、静态变量和初始化为0的全局变量、静态变量就默认全是0了,这样就不会导致上面例子中的那种情况。

如何对Bss段清零?在链接脚本中标记bss段的开始和结束位置,然后在初始化代码的时候把开始标记和结束标记之间的内容清0。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/319423
推荐阅读
相关标签
  

闽ICP备14008679号