मैं जानना चाहता हूं कि जीएनयू कंपाइलर में संकलन के दौरान -mpreferred-stack-boundary
विकल्प का उपयोग क्या है। मैंने प्रलेखन की जांच की है लेकिन स्पष्टीकरण मुझ पर खो गया है। क्या कोई इसे समझा सकता है।gcc -mpreferred-stack-border विकल्प
उत्तर
मैं जानना चाहता हूं कि जीएनयू डीबगर में संकलन के दौरान -प्र्रेफर्ड-स्टैक-सीमा विकल्प का उपयोग क्या है।
विकल्प डीबगर के साथ बिल्कुल कुछ भी नहीं है।
यह आपके बाइनरी में जेनरेट कोड को प्रभावित करता है। डिफ़ॉल्ट रूप से, जीसीसी चीजों की व्यवस्था करेगा ताकि प्रत्येक फ़ंक्शन, तुरंत प्रवेश पर, उसके स्टैक पॉइंटर 16-बाइट सीमा पर गठबंधन हो (यदि आपके पास स्थानीय चर हैं, और sse2
निर्देश सक्षम करें) तो यह महत्वपूर्ण हो सकता है।
यदि आप डिफ़ॉल्ट को बदलते हैं उदा। -mpreferred-stack-boundary=2
, फिर जीसीसी 4-बाइट सीमा पर स्टैक पॉइंटर को संरेखित करेगा। यह आपके दिनचर्या की ढेर आवश्यकताओं को कम करेगा, लेकिन अगर आपका कोड (या कोड जिसे आप कॉल करते हैं) sse2
का उपयोग करता है, तो आमतौर पर सुरक्षित नहीं है।
इसे बाइट सीमाओं के साथ करना है जो आपके प्रोग्राम का उपयोग स्मृति में डाले जाने पर करता है।
क्या स्टैक सीमा = 2 यह सुनिश्चित करता है कि स्टैक को डॉकवर्ड-साइज वृद्धि में स्थापित किया गया है, इससे आपकी मशीन स्टैक को अनुकूलित करने से रोकती है।
आप की जाँच हैं:
`info gcc and search by entering "/mpreferred-stack-boundary"` it says:
>-mpreferred-stack-boundary=num
>
प्रयास ढेर सीमा एक 2 संख्या बाइट सीमा तक बढ़ा करने के लिए गठबंधन रखने के लिए। यदि -प्रभावित-स्टैक-सीमा निर्दिष्ट नहीं है, तो डिफ़ॉल्ट 4 (16 बाइट्स या 128 बिट्स) है।
इंटेल 386 और एएमडी x86-64 मशीनों के लिए 4 की डिफ़ॉल्ट स्टैक सीमा समान है।
जब मैं अपने 64-bit Linux मशीन संकलन पर "एम-पसंदीदा-ढेर सीमा = 2" विकल्प का उपयोग करने की कोशिश त्रुटि
"-mpreffered-ढेर सीमा = 2 है के साथ विफल 4 और 12 के बीच नहीं "।
ऐसा इसलिए है क्योंकि पता फ़ील्ड की चौड़ाई 64 बिट मशीनों में 4 बाइट्स से 8 बाइट्स तक बढ़ी थी। तो यह अलग-अलग हिस्सों को एक स्टैक-सीमा = 2 पर नहीं लिख सकता क्योंकि 2^2 = 4 बाइट्स। हालांकि, दिलचस्प बात यह है कि 3 की एक स्टैक सीमा अभी भी 32 और 64 बिट मशीनों पर एक त्रुटि लौटाती है, जो 8 बाइट सीमा होगी।
मैं लिंक शामिल नहीं कर सकता क्योंकि मेरे पास 10 प्रतिष्ठा नहीं है ... लेकिन एक खोज बहुत आसानी से सामान बदल जाती है जहां तक मैं कह सकता हूं कि यह एक सुरक्षा सुविधा है क्योंकि 8 बाइट स्टैक को गलत तरीके से गलत करने के लिए प्रवण हैं ... इसमें कोई संदेह नहीं है कि कोई और बेहतर जानता है, या अधिक जानकारी है।
How the stack got misaligned कहते हैं
ढेर पर इस मूल्यों की उचित संरेखण सुनिश्चित करने के लिए ढेर सीमा के रूप में ढेर पर संग्रहीत किसी भी मूल्य के लिए आवश्यक है कि के रूप में गठबंधन किया जाना चाहिए। इसके अलावा, प्रत्येक कार्य को उत्पन्न किया जाना चाहिए जैसे कि यह स्टैक गठबंधन रखता है। इस प्रकार एक कम पसंदीदा स्टैक सीमा के साथ संकलित एक फ़ंक्शन से उच्च पसंदीदा स्टैक सीमा के साथ संकलित एक फ़ंक्शन को कॉल करने से अधिकतर स्टैक को गलत तरीके से गलत तरीके से गलत किया जा सकता है। यह अनुशंसा की जाती है कि कॉलबैक का उपयोग करने वाले पुस्तकालय हमेशा डिफ़ॉल्ट सेटिंग का उपयोग करते हैं।
यह अतिरिक्त संरेखण अतिरिक्त स्टैक स्पेस का उपभोग करता है, और आम तौर पर कोड आकार बढ़ाता है। कोड जो अंतरिक्ष उपयोग को ढेर करने के लिए संवेदनशील है, जैसे कि एम्बेडेड सिस्टम और ऑपरेटिंग सिस्टम कर्नेल, पसंदीदा संरेखण को कम करने के लिए -mpreferred-stack-border = 2 को कम करना चाहते हैं।
- 1. जब gcc का -32 विकल्प उपयोग किया जाना चाहिए?
- 2. gcc -lpthread
- 3. चेतावनी_unused_result GCC
- 4. gcc -O2
- 5. "int32 undeclared" gcc त्रुटि
- 6. __uint128_t mingw gcc
- 7. gcc -finline-functions व्यवहार?
- 8. /tmp फ़ोल्डर और gcc
- 9. आर्म-लिनक्स-gnueabi-gcc
- 10. gcc crtbegin crtend
- 11. gcc-mM ध्वज
- 12. gcc -O4 अनुकूलन ध्वज
- 13. 'gcc' gevent-websocket
- 14. 64-बिट llvm-gcc
- 15. mingw32-gcc compiler
- 16. gcc-4.7 और openMP
- 17. gcc -g: क्या होगा
- 18. -lgcc_s और gcc
- 19. g ++ (gcc) या clang (llvm)
- 20. gcc-4.2 निकास स्थिति 1
- 21. व्यापक gnu make/gcc ट्यूटोरियल
- 22. एक gcc sqrt फ़ंक्शन बग?
- 23. gcc/libstdC++ बनाने के दौरान किन कॉन्फ़िगरेशन विकल्प का उपयोग किया गया था?
- 24. arm-eabi-gcc और arm-elf-gcc के बीच क्या अंतर है?
- 25. मेक कमांड लाइन के माध्यम से gcc को gcc को कैसे पास करें?
- 26. सीएमकेई स्ट्रिंग विकल्प
- 27. std :: gCC में put_time कार्यान्वयन स्थिति?
- 28. gcc: _mssql.c: ऐसी कोई फ़ाइल या निर्देशिका
- 29. gcc: चेतावनियों के साथ संकलन कैसे करें
- 30. एक gcc चेतावनी एक त्रुटि बनाओ?
+1 यह उल्लेखनीय है कि वास्तविक सीमा आकार 2^पीएसबी है। यदि आप इस पैरामीटर को 2 पर सेट करते हैं, तो आपको 2^2 = 4 का सीमा आकार मिलेगा। यदि आप इसे 4 पर सेट करते हैं, तो आपको 2^4 = 16 का सीमा आकार मिलेगा। –