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

int main() 
{ 
} 

जब मैं उपरोक्त प्रोग्राम चलाता हूं, तो .bs अनुभाग में 64 बाइट हैं। मैं इसे 36 बाइट्स होने की उम्मीद कर रहा था। Mystruct के लिए 32 बाइट्स और 4 बाइट्स जो अन्य पुस्तकालयों द्वारा लिया जाता है।28 बीएसएस में अतिरिक्त बाइट

यदि मैं 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 हेक्स में 000,040 है

क्यों .bss में इन अतिरिक्त 28 बाइट्स कर रहे हैं?

+0

'.bss' में केवल आपके कोड से कहीं अधिक है। क्या आपको यकीन है कि वहां कुछ और नहीं है? – Petesh

+0

शायद '.bss' केवल 32-बाइट भागों या कुछ में बढ़ाया गया है। आपको पता लगाने के लिए ईएलएफ स्पेक की जांच करने की आवश्यकता हो सकती है ... – twalberg

+1

क्या मैं अभी भी यह सोच रहा हूं कि ओपी आकार को 31 में बदलते समय 36 बाइट्स कैसे प्राप्त हुआ है? (यह देखते हुए कि 36 बहुत स्पष्ट रूप से 32 नहीं है) –

उत्तर

4

readelf आउटपुट का अंतिम स्तंभ संरेखण है, और दिखाया गया मान वास्तव में "32" है। इसलिए, बीएसएस आकार को 32 बाइट्स के नजदीकी एकाधिक तक गोल किया जा रहा है।

1

objdump -sSx पैदावार a.out, अन्य बातों के अलावा ...

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, "algn" के अंतर्गत हम देखते हैं 2 ** 5 या 2^5 उर्फ ​​32. यह इंगित करता है बीएसएस आवंटित किया जाता है 32 बाइट भागों में क्योंकि यह 32 बिट गठबंधन है।

+0

धन्यवाद .... यदि यह 32 बाइट गठबंधन है तो मुझे 36 -bash-3.00 $ बिल्ली के रूप में नीचे दिए गए कोड का आउटपुट क्यों दिखाई देता है bssSize.cc संरचना abc { चार सीसी [31]; } रहस्य; पूर्णांक main() { } -bash-3.00 $ जी ++ bssSize.cc -bash-3.00 $ आकार --format = SysV ./a.out | grep bss .bss 36 134518136 -bash-3.00 $ –

0

objdump आयकर a.out | ग्रेप बीएसएस आप

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 
(हेक्स में 00,000,020)

की उम्मीद आकार 32 बाइट्स के देता है।

संबंधित मुद्दे