C程序存储器映射

时间:2010-11-05 15:10:29

标签: c

  1. static int i = 0; 我分配的变量在哪里?是在BSS还是初始化数据段?
  2. 存储类'extern'和'register'的变量将存储在哪里?
  3. 我可以提供代码片段来交叉检查上面的

3 个答案:

答案 0 :(得分:3)

如果不知道你正在处理的具体实施,就不可能肯定地说。在某些情况下,static int i=0;将存储在初始化的数据段中,因为您已经提供了初始化程序。在其他情况下,无论如何BSS都将进行零初始化,因此无论如何链接器都会将其放在那里。如果您指定了不同的值(例如static int i=12345;),那么您可以更好地确保将其置于初始化的数据段中。

extern并不能确定链接器放置变量的位置。它几乎与上面一样:如果链接器知道(或安排)BSS被零初始化,那么外部没有指定初始化器的东西可能在BSS中。如果BSS未进行零初始化,则通常必须在初始化数据段中。

register基本上等同于auto - 它们都是在运行时分配的,通​​常是在寄存器中或堆栈中。

就验证而言,这更依赖于个人实施。您通常会通过查看链接器映射文件等内容来查找;如果你想自己解决这个问题,很可能会看到正在使用的符号格式,或者为你的系统开发可执行格式的内部。

答案 1 :(得分:1)

如前所述,这取决于。

就我而言(gcc& Linux),我决定去看看:

int main ( int argc, char **argv )
{
    static   int   initialized_static_var = 0;
    static   int   uninit_static_var;
    register int   reg_var;
    extern   int   extern_var;

    return 0;
}

然后objdump -x在可执行文件上(为简洁起见编辑):

0804a018 l     O .bss   00000004              uninit_static_var.1704
0804a01c l     O .bss   00000004              initialized_static_var.1703

寄存器变量和未使用的extern都不会出现在符号表中,如果您考虑它,这是有道理的。

答案 2 :(得分:0)

阅读本文:Where are static variables stored (in C/C++)?

然后制作自己的片段。