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

int main() 
{ 
} 

Po uruchomieniu powyższego programu sekcja .bss ma 64 bajty. Spodziewałem się, że będzie to 36 bajtów. 32 bajty dla mystruct i 4 bajty, które są pobierane przez inne biblioteki.28 dodatkowych bajtów w bss

Jeśli zmienię char cc[32] na char cc[31], otrzymam 36 bajtów w .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 wynosi 000.040 w hex

Dlaczego te dodatkowe 28 bajtów tam .bss?

+0

jest więcej niż tylko twój kod w '.bss'. Jesteś pewien, że nie ma tam nic więcej? – Petesh

+0

Być może '.bss' jest rozszerzone tylko w 32-bajtowych porcjach lub coś w tym stylu. Być może będziesz musiał zbadać specyfikację ELF, aby dowiedzieć się ... – twalberg

+1

Czy jestem jedyną osobą podążającą wzdłuż, która nadal zastanawia się, w jaki sposób osiągnęliśmy 36 bajtów, kiedy OP zmienia rozmiar tablicy na 31? (Biorąc pod uwagę, że 36 jest bardzo wyraźnie nie wielokrotnością 32) –

Odpowiedz

4

Ostatnia kolumna na wyjściu readelf jest wyrównaniem, a wyświetlana wartość rzeczywiście wynosi "32". Tak więc rozmiar BSS jest zaokrąglany w górę do najbliższej wielokrotności 32 bajtów.

1

objdump -sSx a.out rentowności, między innymi ...

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 

pozycja 24, pod "Algn" widzimy 2 ** 5 lub 2^5 aka 32. Oznacza to, BSS jest alokowana w 32-bajtowych porcjach, ponieważ jest wyrównany do 32 bitów.

+0

dzięki .... Jeśli jest wyrównany do 32 bajtów, to dlaczego widzę wynik poniżej kodu jako 36-bash-3.00 $ cat bssSize.cc struct abc { char cc [31]; } mystruct; Int główny() { } -bash-3,00 $ g ++ bssSize.cc -bash-3,00 $ wielkość --format = sysv ./a.out | grep bss .bss 36 134518136 -bash-3.00 $ –

0

objdump -t a.out | grep BSS daje

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 

oczekiwana (00000020 w hex) o rozmiarze 32 bajtów.

Powiązane problemy