Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解C中数据bss段的size命令_C_Windows_Gcc_Memory Layout - Fatal编程技术网

理解C中数据bss段的size命令

理解C中数据bss段的size命令,c,windows,gcc,memory-layout,C,Windows,Gcc,Memory Layout,我从size命令获得意外输出 Afaik初始化了存储在数据段中的全局和静态变量,未初始化并初始化为存储在bss段中的0个全局/静态变量 printf(“%d”,sizeof(int))给出int大小4。然而,bss和数据段并没有相应地增加到4 #include <stdio.h> int main() { return 0; } C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe t

我从
size
命令获得意外输出

Afaik初始化了存储在
数据
段中的全局和静态变量,未初始化并初始化为存储在
bss
段中的0个全局/静态变量

printf(“%d”,sizeof(int))给出
int
大小4。然而,
bss
数据
段并没有相应地增加到4

#include <stdio.h>
int main()
{
    return 0;
}

C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe
   text    data     bss     dec     hex filename
  10044    2292    2512   14848    3a00 memory-layout.exe

#include <stdio.h>
int g; //uninitialised global variable so, stored in bss segment
int main()
{
    return 0;
}

C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe
   text    data     bss     dec     hex filename
  10044    2292    2528   14864    3a10 memory-layout.exe
尽管使用了全局变量,
bss
中没有增量。为什么

 #include <stdio.h>
int main()
{   static int g; //should be on bss segment
    return 0;
}

C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.ex
   text    data     bss     dec     hex filename
  10044    2292    2512   14848    3a00 memory-layout.exe
#包括
int main()
{static int g;//应该在bss段上
返回0;
}
C:\ProgramFiles(x86)\Dev Cpp\MinGW64\bin>size memory-layout.ex
文本数据bss dec十六进制文件名
10044 2292 2512 14848 3a00 memory-layout.exe
尽管使用了静态变量,
bss
段中没有增量,为什么


我还有一个问题,什么是<代码> DEC/代码>这里表示?

首先要考虑的是内存对齐。可以填充变量和节,使它们位于地址边界上。在第二个示例中,您看到比第一个示例增加了16个字节,这意味着填充16字节边界(2512/16=1572528/16=158)。这完全取决于实现

就C而言,第二个例子与第三个不同,因为编译器无法知道
int g
是定义还是仅仅是另一个文件中定义的整数的声明(可以是任何值)。它会留下一个引用供链接器处理,这可能会导致填充的差异

在第三个示例中,
g
被显式定义并设置为0,因此编译器知道将其放入BSS部分

可以用我的系统生成的程序集演示这一点:

使用
int g
(本例中未定义BSS节)

这是链接器处理符号的指令,因为编译器无法完全确定如何处理它

使用
int g=0

    .bss
    .align 4
    .type   g, @object
    .size   g, 4
g:
    .zero   4
在这里,编译器确切地知道要做什么,因此为符号定义了BSS部分

在我的例子中,链接器以相同的方式解析这些。两者都位于同一地址的BSS部分中,因此BSS大小没有差异。您可以使用类似于
nm
的实用程序检查布局

nm -n file2 file3 | grep g$

000000000060103c B g
000000000060103c B g
i、 e.在此系统上,
g
位于同一地址。或者,使用调试器:

(gdb) info symbol 0x60103c
g in section .bss of /tmp/file2
还要注意,在最后一个示例中,变量可以优化,因为它具有内部链接


至于
dec
,它只是以十进制表示的部分之和。

这是来自linux上的gcc:

No Variable
   text    data     bss     dec     hex filename
    915     248       8    1171     493 none.out
Uninitialized Global
   text    data     bss     dec     hex filename
    915     248      12    1175     497 u_g.out
Initialized Global to 123
   text    data     bss     dec     hex filename
    915     252       8    1175     497 i_g.out
Initialized Local to 124
   text    data     bss     dec     hex filename
    915     252       8    1175     497 i_l.out
Initialized Global to 0
   text    data     bss     dec     hex filename
    915     248      12    1175     497 i_g_0.out
Initialized Local to 0
   text    data     bss     dec     hex filename
    915     248      12    1175     497 i_l_0.out
这是Windows上的mingw64:

No Variable
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd none.out
Uninitialized Global
   text    data     bss     dec     hex filename
   3173    1976     464    5613    15ed u_g.out
Initialized Global to 123
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd i_g.out
Initialized Local to 124
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd i_l.out
Initialized Global to 0
   text    data     bss     dec     hex filename
   3173    1976     480    5629    15fd i_g_0.out
Initialized Local to 0
   text    data     bss     dec     hex filename
   3173    1976     480    5629    15fd i_l_0.out

因此,虽然我没有这个问题的最终答案(不适合在评论中),但结果让我怀疑Windows和/或MinGW的可执行文件格式(即非gcc)。

BSS只包含未显式初始化的静态和全局值。即使将其显式初始化为与未显式初始化时相同的值,显式初始化的事实意味着它不属于bss。

使用或命令列出对象/可执行文件,它们的部分和它们的部分。@a3f有什么意义在链接器映射中查看这些变量的实际位置。看起来您的链接器正在以16字节的增量而不是4字节的增量增加节的大小。你可以通过做
inta;int b;INTC;int d;INTE并在其大小增加时进行记录。
intg=0案例似乎表明它将进入
.data
,并且没有增加,因为正如我们刚才看到的那样,已经有了空间。还请记住,如果编译器意识到变量未使用,则可以优化变量;这可能发生在案例2和3中。案例1:未初始化全局:值在BSS中。链接器正在BSS中以16字节边界分配空间。因此,BSS的大小增加了16。案例2:初始化为零:编译器不将此视为默认初始化,并将其与其他初始化的全局变量一起放入数据段中。因此,BSS案例3:函数中的静态变量没有增加。编译器知道您没有使用此变量。BSS中未分配空间。在以前的情况下,由于这些都是全局变量,编译器无法对其进行优化。dec:总大小=文本+bss+十进制数据。这是不正确的。初始化为零的数据可能在BSS部分。@teppic,即使它可能在BSS段中是真的,但它被显式初始化(甚至是0)的事实意味着它不需要在BSS段中。唯一可以说它必须在BSS中的情况是,它没有显式初始化全局静态。这取决于实现,它不必使用BSS做任何事情。这样如何:如果它有BSS,并且它在BSS中存储未初始化的数据(BSS的用途),然后在BSS中存储初始化为0的数据是一个可选的优化。问题是它都是可选的,没有标准,并且由实现(硬件和编译器)定义。BSS更多的是存储应该为零的数据,而不必在二进制文件中分配空间。
No Variable
   text    data     bss     dec     hex filename
    915     248       8    1171     493 none.out
Uninitialized Global
   text    data     bss     dec     hex filename
    915     248      12    1175     497 u_g.out
Initialized Global to 123
   text    data     bss     dec     hex filename
    915     252       8    1175     497 i_g.out
Initialized Local to 124
   text    data     bss     dec     hex filename
    915     252       8    1175     497 i_l.out
Initialized Global to 0
   text    data     bss     dec     hex filename
    915     248      12    1175     497 i_g_0.out
Initialized Local to 0
   text    data     bss     dec     hex filename
    915     248      12    1175     497 i_l_0.out
No Variable
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd none.out
Uninitialized Global
   text    data     bss     dec     hex filename
   3173    1976     464    5613    15ed u_g.out
Initialized Global to 123
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd i_g.out
Initialized Local to 124
   text    data     bss     dec     hex filename
   3173    1976     448    5597    15dd i_l.out
Initialized Global to 0
   text    data     bss     dec     hex filename
   3173    1976     480    5629    15fd i_g_0.out
Initialized Local to 0
   text    data     bss     dec     hex filename
   3173    1976     480    5629    15fd i_l_0.out