2012-04-20 9 views
11

मैं जानना चाहता हूं कि जीएनयू कंपाइलर में संकलन के दौरान -mpreferred-stack-boundary विकल्प का उपयोग क्या है। मैंने प्रलेखन की जांच की है लेकिन स्पष्टीकरण मुझ पर खो गया है। क्या कोई इसे समझा सकता है।gcc -mpreferred-stack-border विकल्प

उत्तर

9

मैं जानना चाहता हूं कि जीएनयू डीबगर में संकलन के दौरान -प्र्रेफर्ड-स्टैक-सीमा विकल्प का उपयोग क्या है।

विकल्प डीबगर के साथ बिल्कुल कुछ भी नहीं है।

यह आपके बाइनरी में जेनरेट कोड को प्रभावित करता है। डिफ़ॉल्ट रूप से, जीसीसी चीजों की व्यवस्था करेगा ताकि प्रत्येक फ़ंक्शन, तुरंत प्रवेश पर, उसके स्टैक पॉइंटर 16-बाइट सीमा पर गठबंधन हो (यदि आपके पास स्थानीय चर हैं, और sse2 निर्देश सक्षम करें) तो यह महत्वपूर्ण हो सकता है।

यदि आप डिफ़ॉल्ट को बदलते हैं उदा। -mpreferred-stack-boundary=2, फिर जीसीसी 4-बाइट सीमा पर स्टैक पॉइंटर को संरेखित करेगा। यह आपके दिनचर्या की ढेर आवश्यकताओं को कम करेगा, लेकिन अगर आपका कोड (या कोड जिसे आप कॉल करते हैं) sse2 का उपयोग करता है, तो आमतौर पर सुरक्षित नहीं है।

+2

+1 यह उल्लेखनीय है कि वास्तविक सीमा आकार 2^पीएसबी है। यदि आप इस पैरामीटर को 2 पर सेट करते हैं, तो आपको 2^2 = 4 का सीमा आकार मिलेगा। यदि आप इसे 4 पर सेट करते हैं, तो आपको 2^4 = 16 का सीमा आकार मिलेगा। –

0

इसे बाइट सीमाओं के साथ करना है जो आपके प्रोग्राम का उपयोग स्मृति में डाले जाने पर करता है।

क्या स्टैक सीमा = 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 को कम करना चाहते हैं।

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