2013-08-09 2 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

왜 .bss라고 거기에 이러한 추가 28 바이트 진수에서 000,040입니까?

+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 | 그렙 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 

예상을 제공합니다.

관련 문제