जब तक वे एक लिंक किए गए पुस्तकालय के आवश्यक संस्करण को नहीं ढूंढते हैं, तब तक यूनिक्स / लिनक्स सिस्टम निर्देशिकाओं के माध्यम से क्यों नहीं चलते हैं?


17

मेरे पास "अल्फा" नाम का एक द्विआधारी निष्पादन योग्य है जिसे एक लिंक किए गए पुस्तकालय (libz.so.1.2.7) की आवश्यकता होती है जिसे यहां रखा गया है /home/username/myproduct/lib/libz.so.1.2.7

मैं निम्नलिखित आदेश को निष्पादित करके अपने द्विआधारी निष्पादन योग्य को जन्म देने से पहले अपने टर्मिनल उदाहरण के लिए निर्यात करता हूं।

export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH

अब, जब मैं एक और एप्लिकेशन "ब्रावो" को पेश करता हूं जिसके लिए एक ही पुस्तकालय की आवश्यकता होती है, लेकिन अलग-अलग संस्करण की, यानी (libz.so.1.2.8) जो /lib/x86_64-linux-gnu/libz.so.1.2.8सिस्टम में उपलब्ध है , सिस्टम निम्न त्रुटि फेंकता है।

version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)

अगर मैं परेशान हूं LD_LIBRARY_PATH, तो "ब्रावो" ठीक शुरू होता है। मैं समझता हूं कि उपरोक्त व्यवहार इसलिए है क्योंकि लिंक किए गए पुस्तकालयों की तलाश LD_LIBRARY_PATHमें परिभाषित निर्देशिका पथों पर पूर्वता है /etc/ld.so.confऔर परिणामस्वरूप उपरोक्त त्रुटि हुई। मैं इस बात को लेकर उत्सुक हूं कि UNIX / LINUX के डेवलपर्स ने पदानुक्रम के अनुसार अन्य निर्देशिकाओं में लिंक्ड लाइब्रेरी की खोज करने के लिए OS का डिज़ाइन क्यों नहीं किया है यदि लाइब्रेरी का पहला उदाहरण अलग संस्करण का है।

सीधे शब्दों में कहें तो UNIX / LINUX सिस्टम निर्देशिकाओं के एक सेट के माध्यम से आगे बढ़ते हैं, जब तक कि यह आवश्यक पुस्तकालय नहीं मिल जाता। लेकिन यह तब तक ऐसा क्यों नहीं करता है जब तक कि वह अपने संस्करण के बावजूद पुस्तकालय के पहले उदाहरण को स्वीकार करने के बजाय अपेक्षित संस्करण नहीं पाता है?


मुझे यकीन नहीं है, लेकिन मैं सुरक्षा के लिए अनुमान लगाऊंगा। मुझे व्यक्तिगत रूप से अपनी मशीनों पर कहीं भी एक सिम्-लिंक के बारे में चिंता करने की ज़रूरत नहीं होगी
जो '

@ जो स्वयं कई पुस्तकालयों के पास उनके बारे में बताते हुए सहानुभूति है। libz.so.1के लिए एक सहानुभूति हैlibz.so.1.2.8
नसीर रिले

जवाबों:


28

लेकिन यह तब तक ऐसा क्यों नहीं करता है जब तक कि वह अपने संस्करण के बावजूद पुस्तकालय के पहले उदाहरण को स्वीकार करने के बजाय अपेक्षित संस्करण नहीं पाता है?

यह करता है, जहाँ तक यह पता है। zlib.so.1.2.7और zlib.so.1.2.8दोनों का बेटा है zlib.so.1, इसलिए आपकी alphaऔर bravoबायनेरिज़ की ज़रूरत है zlib.so.1। डायनेमिक लोडर पहली मिलान लाइब्रेरी को लोड करता है जो इसे ढूंढती है; यह नहीं जानता कि संस्करण 1.2.8 अतिरिक्त प्रतीकों को प्रदान करता है जिनकी bravoआवश्यकता है। (यही कारण है कि वितरण जैसे अतिरिक्त निर्भरता जानकारी, निर्दिष्ट करने के लिए दर्द लेने zlib1g (>= 1.2.8)के लिए bravo।)

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

कुछ लाइब्रेरी संस्करण जानकारी प्रदान करती हैं, जो प्रदान की जा रही .gnu.version_rलाइब्रेरी को लिंक करने के साथ समाप्त हो जाती हैं , जो यहां मदद करेगी, लेकिन libzउनमें से एक नहीं है।

(बेटों को देखते हुए, मुझे उम्मीद है कि आपके alphaबाइनरी के साथ ठीक काम होगा zlib.so.1.2.8।)


और किसी को यह भी ध्यान देना चाहिए कि GNU- शैली की लाइब्रेरी वर्जनिंग शब्दार्थ (-ish) संस्करण से भिन्न होती है, जिसके साथ हम सबसे अधिक आदी होते हैं। चूंकि उनके पास एक ही "वर्तमान" संख्या है, 1, zlib.so.1.2.8 जो zlib.so.1.2.7 के साथ कोई भी सुविधा प्रदान नहीं करनी चाहिए, इसलिए यह बात नहीं करनी चाहिए (एक एबीआई परिप्रेक्ष्य से) जो एक है मिल गया। यह मायने रखता है कि इसे एक दोष माना जाना चाहिए।
जॉन बोलिंगर

4
@ जॉन नहीं, एकमात्र गारंटी यह है कि एक ही सोनम के साथ पुस्तकालय पीछे-संगत हैं; नए पुस्तकालय सुविधाओं को जोड़ सकते हैं, वे किसी को हटा नहीं सकते हैं या किसी भी पीछे-असंगत फैशन में नहीं बदल सकते हैं। यह कहना है, zlib 1.2.7 के खिलाफ बनाया गया एक बाइनरी उस या किसी नए zlib 1 के साथ काम करेगा; लेकिन zlib 1.2.8 के खिलाफ बनाया गया एक द्विआधारी आवश्यक रूप से एक पुराने zlib 1 के साथ काम नहीं करेगा (और अर्थ वर्जनिंग की अनुमति देता है, लेकिन सोनम हैंडलिंग सिमेंटिक संस्करण नहीं है।)
स्टीफन किट

1
मैं विशेष रूप से GNU सम्मेलनों के बारे में बात कर रहा हूँ, जैसा कि मैंने कहा, और मैं विशेष रूप से libtool के बारे में अनुमान लगाता हूं । हर परियोजना उस अधिवेशन का अनुसरण नहीं करती है, इसलिए शायद यह ज़ालिब त्रुटिपूर्ण कहलाने के लिए बहुत मज़बूत है, लेकिन दूसरी ओर, इसमें शामिल पुस्तकालय संस्करण संख्याओं की एक अर्थ-संस्करण व्याख्या भी उसी निष्कर्ष पर पहुंचेगी। फॉरवर्ड (बाइनरी) ऐसे मामलों में अनुकूलता एक वादा soname में निहित नहीं है, लेकिन यह है इस मामले में एक उचित अपेक्षा।
जॉन बोलिंगर

1
हां, मैं CRA संख्या और SOVERSION के बीच संबंध को अच्छी तरह से समझता हूं, जो मेरे मूल बिंदु पर वापस आता है: ओपी द्वारा वर्णित स्थिति सीआरए योजना के सही उपयोग के साथ असंगत लगती है । ओपी जैसी समस्याओं से बचना उस योजना के प्रमुख उद्देश्यों में से एक है। यदि zlib एक नया (a) बाइनरी इंटरफ़ेस का संस्करण जोड़ता है, तो इसकी C संख्या को बढ़ाना चाहिए। इस तरह के एक टक्कर एक बोहनी टक्कर के लिए नेतृत्व कर सकते हैं और साथ ही माध्यमिक है।
जॉन बोलिंगर

2
@ ठीक है, मुझे संदेह है कि हम हिंसक समझौते में हैं और मैं उस बिंदु को गलत समझ रहा हूं जो आप बना रहे थे। zlibका उपयोग नहीं करता libtoolवैसे भी, डार्विन जहां यह है पर छोड़कर ar;-)।
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.