2009-09-21 12 views
16

मैं समांतर कार्यक्रमों के लिए रनटाइम सिस्टम पर काम कर रहा हूं जो कई प्रक्रियाओं में एक सामान्य पता स्थान लेआउट का लाभ उठा सकता है, संभावित रूप से कई (हजार) नोड्स पर फैल सकता है। कई बार, इस वातावरण के लिए बनाया गया सॉफ़्टवेयर लिनक्स सिस्टम पर चलाया जाता है जिसमें डिफॉल्ट स्पेस यादृच्छिकता डिफ़ॉल्ट रूप से सक्षम होती है, और उपयोगकर्ता इसे सिस्टम-वाइड (sysctl -w kernel.randomize_va_space=0 और इसी तरह से) अक्षम करने में सक्षम नहीं हो सकते हैं। यह समांतर कार्यक्रमों पर कुछ सीमाएं लगाता है, और प्रदर्शन को नुकसान पहुंचा सकता है। इस प्रकार, हम यह समझना चाहते हैं कि हमारे द्वारा बनाई जाने वाली बाइनरी के लिए इसे कैसे अक्षम किया जाए। सुरक्षा एक मुद्दा नहीं है, क्योंकि यह सॉफ्टवेयर हमेशा नियंत्रित वातावरण में चल रहा है।लिनक्स पर बाइनरी के लिए पता स्थान यादृच्छिकरण को कैसे अक्षम करें?

मैंने पाया विभिन्न झंडे और चर, ET_EXEC, EF_AS_NO_RANDOM (जाहिरा तौर पर कभी नहीं मिला दिया गया?) और PF_RANDOMIZE की तरह है, लेकिन मैं किसी भी दस्तावेज़ का वर्णन करता है कि मैं इन झंडे सेट करने के लिए क्या कर सकते हैं नहीं मिल सकता है के लिए संदर्भ। एक आदर्श जवाब मुझे बताएगा कि कंपाइलर/असेंबलर/लिंकर ध्वज परिणामस्वरूप बाइनरी के लिए यादृच्छिकरण अक्षम करेगा, और टूल-चेन/कर्नेल के कौन से संस्करण इस पर काम करते हैं। अगला सबसे अच्छा उपकरण होगा जो बाइनरी के निर्माण के बाद ही होता है।

चूंकि मुझे यकीन है कि कोई इसका सुझाव देगा, मुझे पहले से ही पता है कि हम setarch -R के साथ रनटाइम पर यह परिवर्तन कर सकते हैं, लेकिन इसे निष्पादन योग्य में रिकॉर्ड करना बेहतर है।

ऐसा लगता है कि paxctl -rx चाल चलाना चाहिए, लेकिन ऐसा लगता है कि यह मौजूदा विधि पर लागू नहीं होता है जिसमें पेक्स पैच शामिल नहीं हैं।

उत्तर

14

संभवतः आपके पास कुछ प्रकार का डिमन है जो नोड्स पर आपके समांतर कार्यक्रमों को आमंत्रित करता है। यदि ऐसा है, तो आप इस सामान्य अभिभावक को एएसएलआर को किसी भी बच्चे की प्रक्रियाओं के लिए अक्षम कर सकते हैं।

जीडीबी स्रोतों (7.0 या सीवीएस हेड) में ऐसा करने के लिए देखें। इसके बारे में fork और exec से पहले personality(orig_personality|ADDR_NO_RANDOMIZE) पर कॉल करना है।

+0

मैं जांच करूँगा और इसे आजमाएं। – Novelocrat

+0

काम किया लगता है। धन्यवाद! – Novelocrat

1

क्या कोई कारण है कि आप shared memory स्थान को मानचित्र नहीं कर सकते हैं या नाम FIFO का उपयोग कर सकते हैं?

+1

वहाँ है। हम कई नोड्स में चल रहे हैं। – Novelocrat

0

लिनक्स कर्नेल preserved offsets when forking में एएसएलआर के कम से कम कुछ पुराने संस्करण। अपनी प्रक्रियाओं के लिए यादृच्छिकरण को अक्षम करने के बजाय, क्या आप उन्हें माता-पिता/बाल प्रक्रिया पदानुक्रम के तहत व्यवस्थित करने में सक्षम हो सकते हैं, जिसने ऑफसेट को समान माता-पिता द्वारा बाइनरी बाइनरी के उदाहरणों के बीच समान रखा है?

+1

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