Amit Sinha
Amit Sinha

Reputation: 121

28 extra bytes in bss

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

int  main()
{
}

When I run the above program, the .bss section has 64 bytes. I was expecting it to be 36 bytes . 32 bytes for mystruct and 4 bytes which is taken by other libraries.

If I change char cc[32] to char cc[31] then I get 36 bytes in .bss.

-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$ 

64 is 000040 in hex

Why are these extra 28 bytes there in .bss ?

Upvotes: 6

Views: 230

Answers (3)

Knight71
Knight71

Reputation: 2949

objdump -t a.out |grep bss gives you

    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

the expected (00000020 in hex) of size 32 bytes.

Upvotes: 0

tallen
tallen

Reputation: 697

objdump -sSx a.out yields, among other things...

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

item 24, under "Algn" we see 2**5 or 2^5 aka 32. This indicates bss is allocated in 32 byte chunks because it is 32 bit aligned.

Upvotes: 1

user149341
user149341

Reputation:

The last column of the readelf output is alignment, and the value shown is indeed "32". So, the BSS size is being rounded up to the nearest multiple of 32 bytes.

Upvotes: 4

Related Questions