2013-08-09 12 views
6
struct abc 
{ 
    char cc[32]; 
} mystruct; 

int main() 
{ 
} 

上記のプログラムを実行すると、.bssセクションのサイズは64バイトになります。私はそれが36バイトであると予想していました。 Mystructでは32バイト、他のライブラリでは4バイトが使用されます。bssの余分なバイト数

char cc[32]からchar cc[31]に変更すると、.bssで36バイトになります。

-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進で000040である

なぜ.bssの中に存在し、これらの余分な28のバイトですか?

+0

'.bss'にはあなたのコード以上のものがあります。あなたはそこに何もないと確信していますか? – Petesh

+0

おそらく '.bss'は32バイトのチャンクなどでのみ拡張されます。 ... – twalberg

+1

OPが配列のサイズを31に変更したときに36バイトになったのはどういうことでしょうか? (36が非常にはっきりと32の倍数ではないことを考えると) –

答えて

4

readelf出力の最後の列はアラインメントであり、実際には値は「32」です。したがって、BSSサイズは32バイトの最も近い倍数に切り上げられています。

1

objdumpの-sSx利回りのa.out、とりわけ...私たちは** 5 2または2^5を参照してください "Algn" の下

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 

項目24、別名32.これが示すBSSが割り当てられていますそれは32ビット整列であるため、32バイトのチャンクに入れます。

+0

ありがとうございました.32バイト整列であれば、以下のコードの出力を36-bash-3.00 $ cat bssSize.cc struct abc { char cc [31]; } mystruct; INTメイン(){ } -bash-3.00 $ G ++ bssSize.cc -bash-3.00 $サイズ= SysVの--format ./a.out | grep bss .bss 36 134518136 -bash-3.00 $ –

0

はobjdumpは-tのa.out | grepののBSSは、あなたのサイズ32バイトの(16進数で00000020)

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 

期待を与えます。

関連する問題