C bss中的28个额外字节

C bss中的28个额外字节,c,memory-management,C,Memory Management,当我运行上述程序时,.bss部分有64个字节。我希望它是36字节。mystruct使用32字节,其他库使用4字节 如果我将char cc[32]更改为char cc[31],则在.bss中获得36个字节 struct abc { char cc[32]; } mystruct; int main() { } 64是十六进制的000040 为什么.bss中有这些额外的28字节 readelf输出的最后一列是alignment,显示的值实际上是“32”。因此,BSS大小被四舍五入到32字

当我运行上述程序时,.bss部分有64个字节。我希望它是36字节。mystruct使用32字节,其他库使用4字节

如果我将
char cc[32]
更改为
char cc[31]
,则在.bss中获得36个字节

struct abc
{
   char cc[32];
} mystruct;

int  main()
{
}
64是十六进制的000040


为什么.bss中有这些额外的28字节

readelf输出的最后一列是alignment,显示的值实际上是“32”。因此,BSS大小被四舍五入到32字节的最接近倍数。

objdump-sSx a.out产生的结果,以及其他一些东西

-bash-3.00$ g++ bssSize.cc

-bash-3.00$ readelf --sections ./a.out | grep bss
  [23] .bss              NOBITS          08049580 000578 000040 00  WA  0   0 32
-bash-3.00$ 

第24项,在“Algn”项下,我们看到2**5或2^5 aka 32。这表明bss是以32字节块分配的,因为它是32位对齐的。

objdump-t a.out | grep bss为您提供

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000400238  0000000000400238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000400254  0000000000400254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.gnu.build-id 00000024  0000000000400274  0000000000400274  00000274  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     0000001c  0000000000400298  0000000000400298  00000298  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       00000048  00000000004002b8  00000000004002b8  000002b8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       00000038  0000000000400300  0000000000400300  00000300  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  00000006  0000000000400338  0000000000400338  00000338  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 00000020  0000000000400340  0000000000400340  00000340  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.dyn     00000018  0000000000400360  0000000000400360  00000360  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rela.plt     00000018  0000000000400378  0000000000400378  00000378  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .init         00000018  0000000000400390  0000000000400390  00000390  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt          00000020  00000000004003b0  00000000004003b0  000003b0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .text         000001c8  00000000004003d0  00000000004003d0  000003d0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .fini         0000000e  0000000000400598  0000000000400598  00000598  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .rodata       00000004  00000000004005a8  00000000004005a8  000005a8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 15 .eh_frame_hdr 0000002c  00000000004005ac  00000000004005ac  000005ac  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame     000000a4  00000000004005d8  00000000004005d8  000005d8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .ctors        00000010  0000000000600e28  0000000000600e28  00000e28  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 18 .dtors        00000010  0000000000600e38  0000000000600e38  00000e38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 19 .jcr          00000008  0000000000600e48  0000000000600e48  00000e48  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 20 .dynamic      00000190  0000000000600e50  0000000000600e50  00000e50  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 21 .got          00000008  0000000000600fe0  0000000000600fe0  00000fe0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .got.plt      00000020  0000000000600fe8  0000000000600fe8  00000fe8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 23 .data         00000010  0000000000601008  0000000000601008  00001008  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 24 .bss          00000040  0000000000601020  0000000000601020  00001018  2**5
                  ALLOC
 25 .comment      0000002a  0000000000000000  0000000000000000  00001018  2**0
                  CONTENTS, READONLY

预期大小为32字节(00000020十六进制)。

.bss
中,不仅仅是您的代码。你确定里面没有其他内容吗?可能
.bss
只扩展为32字节的块或其他内容。你可能需要调查一下ELF规范来找出答案……我是唯一一个还在想当OP将数组大小更改为31时我们是如何得到36字节的人吗?(考虑到36显然不是32的倍数)谢谢。。。。如果它是32字节对齐的,那么为什么我看到下面代码的输出是36-bash-3.00$cat bssSize.cc struct abc{char cc[31];}mystruct;int main(){}-bash-3.00$g++bssSize.cc-bash-3.00$size--format=sysv./a.out | grep bss.bss 36 134518136-bash-3.00$
    08049660 l    d  .bss   00000000              .bss
    08049660 l     O .bss   00000001              completed.5745
    08049660 g       *ABS*  00000000              __bss_start
    08049680 g     O .bss   00000020              mystruct