मैं निष्पादन योग्य के "सामान्य" खंड के बारे में अधिक समझने की कोशिश कर रहा हूं और मैंने देखा है कि संकलित कोड पर objdump
करने पर, मैं सामान्य कोड में केवल ऑब्जेक्ट फ़ाइलों (*.o
) पर सामान्य कोड में रखे गए चर देख सकता हूं।सामान्य अनुभाग चर केवल ऑब्जेक्ट फ़ाइल में निष्पादन योग्य क्यों नहीं दिखाते हैं?
वह क्यों है?
//test.c
int i[1000];
int main(){return 0;}
निर्माण आदेश:
> gcc -g0 -fcommon -c test.c
> gcc -g0 -fcommon test.c
objdump
प्रतीक तालिका में आम खंड में i
पता चलता है:
> objdump -x test.o
...
SYMBOL TABLE:
...
00000fa0 O *COM* 00000020 i
जब तक मैं निष्पादन पर चला:
> objdump -x a.out
...
SYMBOL TABLE:
...
0804a040 g O .bss 00000fa0 i
यदि मैं ऑब्जेक्ट फ़ाइल को -fno-common
ध्वज के साथ पुनर्निर्माण करता हूं, तो यह .bss
सेगमेंट में दिखाई देता है जैसे कि यह निष्पादन योग्य पर होता है। क्या अंतिम निष्पादन योग्य के पास यह "COMMON" अनुभाग नहीं है?
ठीक है ... तो आम अनुभाग का बिंदु क्या है?'fcommon' और' fno-common 'दोनों के साथ अंतिम परिणाम निष्पादन योग्य के .bs सेगमेंट में अनियमित चर समाप्त होता है; या यह उसी कारण से अस्तित्व में है जिसे आपने लिखा था "[एक ठेठ]" '? जिसका अर्थ है कि – Mike
@ माइक हैं लेकिन कंपाइलर को इसके बारे में पता नहीं है- यह पता लगाने के लिए लिंकर्स नौकरी है। लक्ष्य (और निष्पादन योग्य प्रारूप) जो एक .bss अनुभाग प्रदान करते हैं, बीएसएस अनुभाग सामान्य रूप से आवंटित किया जाता है और रनटाइम पर प्रारंभ किया जाता है। उन लक्ष्यों पर जिनके पास क्षमता नहीं है, आम अनुभाग निष्पादन योग्य में समाप्त होते हैं, और यदि आपके पास 10 एमबी की वैश्विक सरणी है, तो आपका निष्पादन योग्य 10 एमबी बड़ा होता है। यह आपको अपनी खुद की लिंकर स्क्रिप्ट लिखने की अनुमति देता है, और उन सामान्य वर्गों को स्थान देता है जहां आप उन्हें चाहते हैं। -फनो-आम के पास अन्य उपयोग हैं, जो कि जीसीसी मैन पेज हालांकि बताते हैं। – nos
मैंने कहा "एक ठेठ" क्योंकि कुछ आर्किटेक्चर में अतिरिक्त अनुभाग जोड़ना संभव है, और इन वर्गों को सभी प्रकार के विशेषताओं को भी असाइन किया जा सकता है। सभी कंपाइलर्स, लिंकर्स इत्यादि इसका समर्थन नहीं करेंगे, और बड़ी संख्या में ओएस आर्किटेक्चर के साथ 'जीसीसी' बड़ी संख्या में सिस्टम चलाने में सक्षम है। मैं नहीं चाहता था कि किसी को यह इंगित करने के लिए कि ओएस ग्लूर्फ पर, लिंकर एक्स के साथ, आपके पास अनुभाग हैं ..., आदि –