2013-08-12 4 views
6

निर्धारित करता है .data और .bss का संरेखण कभी-कभी 4 बाइट होता है और कभी-कभी यह 32 बाइट्स होता है। उदाहरण 1: नीचे उत्पादन में अंतिम स्तंभ के अनुसार बीएसएस और डेटा के संरेखण 32 बाइट्स.data और .bss का संरेखण

bash-3.00$ readelf --sections libmodel.so 
There are 39 section headers, starting at offset 0x1908a63c: 

Section Headers: 
    [Nr] Name    Type   Addr  Off Size ES Flg Lk Inf Al 
... 
    [25] .data    PROGBITS  01e221e0 1e211e0 26ca54 00 WA 0 0 32 
    [26] .bss    NOBITS   0208ec40 208dc34 374178 00 WA 0 0 32 
... 

उदाहरण 2: नीचे उत्पादन के अनुसार संरेखण ओएस .data और .bss 4 बाइट

है
bash-3.00$ readelf --sections ./a.out 
There are 28 section headers, starting at offset 0x78c: 

Section Headers: 
    [Nr] Name    Type   Addr  Off Size ES Flg Lk Inf Al 
... 
    [22] .data    PROGBITS  0804956c 00056c 000034 00 WA 0 0 4 
    [23] .bss    NOBITS   080495a0 0005a0 000004 00 WA 0 0 4 
... 

.bss और .data के लिए संरेखण निर्धारित करता है? कभी-कभी 4 बाइट्स और दूसरी बार 32 बाइट क्यों होते हैं?

+2

डेटा संरेखण एक कंपाइलर कार्यान्वयन विवरण है। यह बात क्यों है? आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं? –

+0

@lsk मैं अपने आवेदन के .bss सेगमेंट के आकार को कम करने की कोशिश कर रहा हूं ताकि यह संसाधन बाधा होस्ट पर कम स्मृति का उपभोग करे। मैं उम्मीद करता हूं कि वैश्विक अंतरिक्ष में परिभाषित सभी अनियमित वस्तुओं के आकार के संक्षेप के बराबर होना चाहिए। लेकिन अगर मैं किसी ऑब्जेक्ट के आकार को 8 बाइट्स से कम करता हूं तो भी .bss के आकार में कोई कमी नहीं होती है।प्रतीक तालिका दिखाती है कि ऑब्जेक्ट आकार 8 बाइट्स से कम हो गया है लेकिन .bs आकार में कोई बदलाव नहीं है। 10,000 ऐसी वस्तुएं हैं लेकिन जब मैं कक्षा के आकार को 8 बाइट्स से कम करता हूं तो मुझे .bss में कोई बदलाव नहीं दिखता है। –

उत्तर

0

मुझे लगता है कि उन अलग-अलग संरेखण मान संबंधित ld स्क्रिप्ट द्वारा निर्धारित किए गए थे।

    libmodel.so लिए
  • : section .data align=16, section .bss align=16
  • a.out के लिए: section .data align=4, section .bss align=4
+0

चूंकि 'libmodel.so' डेटा स्पष्ट रूप से अंतिम कॉलम में 'अल 32' कहता है, ऐसा लगता है कि निर्दिष्ट संरेखण 16, –

+0

के बजाय 32 के रूप में निर्दिष्ट किया गया था। Libmodel.so में .data और .bss दोनों अनुभाग 32 बाइट्स के साथ गठबंधन किया गया है। उदाहरण के लिए, .डेटा अनुभाग के लिए, पता 01e221e0 है, इसका मतलब है कि अंतिम पांच एलएसबी बिट्स को शून्य पर सेट कर दिया गया है। दूसरे शब्दों में, यह 32bytes के साथ संरेखित करता है। – gtv

0

क्यों यह कभी कभी 4 बाइट है और अन्य समय 32 बाइट्स पर?

एक बार निष्पादन योग्य स्मृति में लोड हो जाने पर, इसे प्रक्रिया वर्चुअल पतों के माध्यम से संबोधित किया जाता है। संरेखण बाधाएं वर्चुअल एड्रेस एड्रेसिंग के कारण हैं। उदाहरण के लिए, यदि आप elf के लिए मैन पेज देखते हैं, sh_addralign के लिए विवरण देखें। यही कारण है कि विभिन्न elf ऑब्जेक्ट्स विभिन्न संरेखण आवश्यकताओं को निर्दिष्ट करते हैं। आप डबल को शामिल करने के लिए स्रोत को बदलकर प्रयोग कर सकते हैं और देख सकते हैं कि संरेखण बदलता है या नहीं।

नोट: यह केवल स्मृति संरेखण पर लागू होता है। वास्तविक ऑन-डिस्क फ़ाइल के लिए एक संरेखण प्रतिबंध भी है। क्यूं कर? मैं सोच रहा हूं कि फ़ाइल को पढ़ने के बाद इन-कोर संरचनाओं में मैपिंग फ़ाइल डेटा को मैप करने में आसानी होगी। अगर मैं यहां गलत हूं तो अन्य मुझे सही कर सकते हैं।

अद्यतन: एक समस्या को स्पष्ट करना चाहते हैं। वर्चुअल एड्रेस संरेखण केवल चिपसेट द्वारा लागू अंतर्निहित स्मृति पहुंच ग्रैन्युलरिटी के कारण आवश्यक है। इसलिए, विभिन्न आर्किटेक्चर के लिए संकलित एक ही प्रोग्राम अलग-अलग संरेखण प्रतिबंधों का कारण बन सकता है।

0

एक बहुत अच्छी किताब है, जो आपको न केवल आपके प्रश्न की एक बड़ी समझ देगी, बल्कि इससे संबंधित सब कुछ।

पुस्तक की वेबसाइट here

अध्याय n है। 7 वह है जिसे आप ढूंढ रहे हैं।

मुझे नहीं पता कि आप सीधे जवाब चाहते हैं, या एक अधिक परिष्कृत, लेकिन मुझे आशा है कि इससे मदद मिलती है।

0

बीएसएस के लिए संरेखण का निर्धारण डेटा प्रकारों के आकार का उपयोग करके किया जाता है, अगर इसे गठबंधन नहीं किया जाता है तो लिंकर पहले वैरिएबल पते को संरेखित करता है जहां बीएसएस शुरू किया जा सकता है।

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