जैसा कि क्यों कहा जाता है कि एक सॉफ्टवेयर पैकेज उन्नत होने के बावजूद भी ठीक चलता है? , लॉक फाइल नाम पर नहीं इनोड पर रखा गया है। जब आप किसी बाइनरी को लोड और निष्पादित करते हैं, तो फ़ाइल को व्यस्त के रूप में चिह्नित किया जाता है - यही कारण है कि जब आप इसे लिखने का प्रयास करते हैं तो आपको ETXTBSY (फ़ाइल व्यस्त) त्रुटि मिलती है।
अब, साझा पुस्तकालयों के लिए यह थोड़ा अलग है: पुस्तकालयों को प्रक्रिया के साथ पता स्थान में स्मृति मैप किया जाता है mmap()
। यद्यपि MAP_DENYWRITE
निर्दिष्ट किया जा सकता है, कम से कम लिनक्स पर Glibc चुपचाप इसे अनदेखा करता है (मैन पेज के अनुसार, स्रोतों की जांच करने के लिए स्वतंत्र महसूस करें) - इस धागे की जांच करें । इसलिए आपको वास्तव में फ़ाइल लिखने की अनुमति है और, जैसा कि यह मेमोरी मैप्ड है, कोई भी परिवर्तन लगभग तुरंत दिखाई देता है - जिसका अर्थ है कि यदि आप पर्याप्त प्रयास करते हैं तो आप लाइब्रेरी को अधिलेखित करके अपनी मशीन को ईंट करने का प्रबंधन कर सकते हैं ।
इसलिए अद्यतन करने का सही तरीका है:
फ़ाइल को निकालना, जो फ़ाइल सिस्टम से डेटा के संदर्भ को हटा देता है, ताकि यह किसी भी नव-निर्मित अनुप्रयोगों के लिए सुलभ न हो, जो इसका उपयोग करना चाहते हैं, जबकि किसी के लिए डेटा को सुलभ रखना जो पहले से ही खुला है (या मैप किया गया है) ;
अद्यतन सामग्री के साथ एक नई फ़ाइल बनाना।
नई बनाई गई प्रक्रियाएं अपडेट की गई सामग्रियों का उपयोग करेंगी, चल रहे एप्लिकेशन पुराने संस्करण का उपयोग करेंगे। यह वही है जो किसी भी प्रकार का पैकेज प्रबंधन उपयोगिता करता है। ध्यान दें कि यह पूरी तरह से किसी भी खतरे के बिना नहीं है - उदाहरण के लिए एप्लिकेशन गतिशील रूप से लोडिंग कोड (का उपयोग करके dlsym()
और दोस्तों) लाइब्रेरी के एपीआई को चुपचाप परेशान करता है।
यदि आप वास्तव में, वास्तव में सुरक्षित पक्ष पर होना चाहते हैं, तो सिस्टम को बंद करें, फ़ाइल सिस्टम को किसी अन्य ऑपरेटिंग सिस्टम उदाहरण से माउंट करें, अपडेट करें और अपडेट किए गए सिस्टम को फिर से लाएं।
.so
फ़ाइल का उपयोगldd filename.so
कर सकते हैं