2012-06-05 8 views
7

मुझे LD_LIBRARY_PATH बदलने पर अजीब साइड इफेक्ट्स हैं।एलडी_LIBRARY_PATH दुष्प्रभाव

जब मैं एक पुस्तकालय युक्त पथ जोड़ता हूं, उदा। :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

फिर, सबकुछ अविश्वसनीय रूप से धीमा हो जाता है। उदाहरण के लिए, एक साधारण ls 10 सेकंड लंबा हो सकता है।

ldd उत्पादन बिल्कुल उसी से पहले और LD_LIBRARY_PATH परिवर्तन के बाद है और मैं strace साथ धीमी गति से ls के निष्पादन डिबग करने की कोशिश की: मैं दोनों ही मामलों में ठीक उसी निष्पादन मिलता है। निष्पादन ls के निष्पादन के दौरान भी अटक नहीं जाता है (क्योंकि strace 10-सेकंड अंतराल के दौरान कुछ भी आउटपुट नहीं करता है और फिर अचानक ls निष्पादित करता है)। तो मैंने सोचा कि यह मेरे खोल से आ सकता है, लेकिन यह वही है, मेरे बैश पर strace चला रहा है और दोनों मामलों में ls निष्पादित करने से मुझे strace आउटपुट देता है: खोल ls निष्पादित करता है और इसके निष्पादन के अंत की प्रतीक्षा करता है (अंतिम stracestracewaitpid(...) है) से पहले आउटपुट। तो मुझे लगता है कि ls के लॉन्च और उसके निष्पादन के बीच कुछ गलत होता है, जैसे कि यह कर्नेल-स्तरीय समस्या थी। यह वास्तव में कार्य करता है जैसे sleepls (0 सीपीयू उपयोग) पर बनाया गया था।

अंतराल के दौरान, मेरी सीपीयू और नेटवर्क गतिविधि पूरी तरह से सामान्य हैं ...

ध्यान दें कि नई एलडी रास्ते में पुस्तकालय किसी भी "मानक पुस्तकालय" से विरोध नहीं करता, तो यह में ls परेशान नहीं करता है मेरी उदाहरण।

तो मैं LD_LIBRARY_PATH साइड इफेक्ट्स के बारे में गहन स्पष्टीकरण में दिलचस्प हूं या कैसे अपना उदाहरण गहराई से डीबग करना है।

+0

अच्छा सवाल। मैंने 'LD_LIBRARY_PATH' का उपयोग किया है और इस तरह के व्यवहार को कभी नहीं देखा है, फिर भी आपका अवलोकन अलग और स्पष्ट दोनों लगता है। दिलचस्प। – thb

+7

'निर्यात LD_DEBUG = सभी' और 'मैन 8 ld.so' –

+0

उचित रूप से स्पष्ट है लेकिन" ldd $ (जो ls) "एलडी_LIBRARY_PATH से कुछ भी उपयोग करता है तो एक सुराग दे सकता है। – Matthias

उत्तर

0

मुझे यकीन है कि और क्या आपके LD_LIBRARY_PATH या लाइब्रेरी में जोड़ने या कोशिश कर रहे हैं कार्यक्रम आप चल रहे हैं पर है नहीं कर रहा हूँ, लेकिन आप शायद दूर एक आवरण स्क्रिप्ट लिखने सिर्फ प्रोग्राम है जो अतिरिक्त जरूरत के लिए LD_LIBRARY_PATH बदलने के लिए बेहतर होते हैं लाइब्रेरी ताकि आपके सिस्टम ls जैसे काम प्रभावित न हों।

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

फ़ाइल बनाएँ और chmod +x wrapper_name

+1

हां, मैं आपसे सहमत हूं, लेकिन मैं सिर्फ मौजूदा निर्माण प्रणाली का शिकार हूं ... –

1

इस पोस्ट में वर्ष छोड़ने है, इसलिए यदि आप पहले से ही एक समाधान खोजने मैं नहीं जानता। वैसे भी, मुझे नहीं पता कि इससे मदद मिल सकती है, लेकिन अधिकांश आधुनिक जीएनयू/लिनक्स सिस्टम में, एलडी_LIBRARY_PATH का उपयोग को हटा दिया गया है और निराश किया गया है।

  1. अगर आप इसे उपयोग जारी रखना चाहते, पूर्व लंबित बजाय LD_LIBRARY_PATH के लिए आपकी लाइब्रेरी पथ जोड़कर पहली कोशिश:

    इसलिए मैं कुछ सुझाव है। इससे मदद मिलनी चाहिए यदि ऐसी कुछ ऐसी चीज है जो पिछली लाइब्रेरी निर्देशिकाओं में पथ को स्कैन करने में लंबा समय लेती है।

  2. एलडीकॉनएफआईजी सिस्टम का उपयोग करें, जो आज (0) उचित तरीके से एलडी निर्देशिकाओं का उपयोग करने का उचित तरीका है। आपको बस अपनी लाइब्रेरी में /etc/ld.so.conf फ़ाइल में पथ जोड़ना होगा, या बेहतर, /etc/ld.so.conf में एक फ़ाइल जोड़ें।डी/जिसमें आपकी लाइब्रेरी का पथ शामिल है (यदि /etc/ld.so.conf में कोई निर्देश शामिल है, तो इसे सामान्य रूप से डिफ़ॉल्ट रूप से मामला दर्ज किया जाएगा)। फिर सिस्टम एलडी खोज पथ को अद्यतन करने के लिए sudo ldconfig चलाएं।

मुझे यह सहायता चाहिए। चीयर्स

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

  • कोई संबंधित समस्या नहीं^_^