2011-11-17 9 views
13

मैं देख रहा हूँ यह libmysqlclient.so.16 पर एक निर्भरता है कि जब मैं इस तरह के libphp5.so के रूप में एक साझा लाइब्रेरी के खिलाफ ldd चलाएँ:लिनक्स पर साझा लाइब्रेरी निर्भरता पथ कैसे निर्धारित किए जाते हैं?

 
$ ldd ./libphp5.so 
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 
[other dependencies snipped out] 

इन निर्भरता फ़ाइल नाम और पथ (/usr/lib/mysql/libmysqlclient.so.16) कर रहे हैं साझा लाइब्रेरी बाइनरी में शामिल किया हुआ? या फिर इस मार्ग जो संयोग से होती हैं, जैसे /etc/ld.so.conf.d/mysql-i386.conf के माध्यम से के रूप में कुछ अन्य साधनों, द्वारा निर्धारित किया जाता है:

/usr/lib/mysql/ 

एक अन्य बात यह है कि मुझे puzzling है:

कि मैं स्रोत से संकलन किसी साझा लाइब्रेरी मेरे पास नहीं है। इसकी libmysqlclient_r पर निर्भरता है। gcc संकलक स्विच की तरह इस इस पुस्तकालय नज़र निर्माण करने के लिए:

 
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches] 

जब मैं ldd mylib.so करना मैं देख रहा हूँ:

 
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000) 

हालांकि /usr/lib/mysql निर्देशिका में मैं देख रहा हूँ:

 
-rwxr-xr-x. libmysqlclient_r.so -> libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0 
-rwxr-xr-x. libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so -> libmysqlclient.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so.16 -> libmysqlclient.so.16.0.0 
-rwxr-xr-x. libmysqlclient.so.16.0.0 

libmysqlclient_r.so है libmysqlclient_r.so.16.0.0 पर एक प्रतीकात्मक लिंक, तो ldd निर्भरता को libmysqlclient_r.so.16 के रूप में क्यों दिखाता है। क्या कोई जादू है जो मैं यहाँ याद कर रहा हूँ?

कई वर्षों से विंडोज़ देव रहा है, मैं gcc और लिनक्स पर विकास के लिए थोड़ा नया हूं।

मेरा लिनक्स वितरण CentOS 6.0 x86-32bit है।

उत्तर

14

आप देख सकते हैं कि कौन से पथ कहाँ से आ रहे

LD_DEBUG=libs ldd ./libphp5.so 

चलाकर इन निर्भरता फ़ाइल नाम और पथ (/usr/lib/mysql/libmysqlclient.so.16) शेयर की गई लाइब्रेरी बाइनरी में शामिल किया हुआ हैं ?

फ़ाइल नाम लगभग निश्चित रूप से है। पथ आमतौर पर नहीं है। आप देख सकते हैं क्या साथ (NEEDED) और (RPATH) प्रविष्टियों के लिए

readelf -d ./libphp5.so 

देखो बाइनरी में शामिल किया हुआ है।

भी man ld.so एक पठन दें।ऐसे कई कारक हैं साझा पुस्तकालयों के लिए कैसे गतिशील लोडर खोज को प्रभावित कर रहे हैं: ld.so.conf, LD_LIBRARY_PATH, चाहे निष्पादन suid या नहीं, कैसे glibc कॉन्फ़िगर किया गया था, जो -rpath सेटिंग लिंक समय में दिए गए थे, आदि आदि

+0

धन्यवाद है, कि कुछ उपयोगी पॉइंटर्स। – Kev

+0

आपको कोई जानकारी नहीं है, लेकिन मेरी इच्छा है कि मैं इसे और भी ऊपर उठा सकता हूं। मेरा प्रश्न एक पायथन पनीर शॉप पैकेज (MySQL-Python) में उपयोग किए गए 'libmysqlclient_r' को लोड करने में असमर्थ होने से असमर्थ होने से उत्पन्न हुआ है, इसके बावजूद इसे ठीक/ठीक करने के बावजूद। 'LD_DEBUG = libs ldd' मेरा जीवन सुरक्षित था। यह पारदर्शी है कि '/ etc/ld.co.conf.d' में सहेजी गई पथ फ़ाइल '.conf' में समाप्त नहीं हुई है और मेरी'/etc/ld.so.conf' फ़ाइल निर्दिष्ट करती है:' ld.so शामिल करें। conf.d/*। conf'। तो '/ usr/lib/mysql' फ़ोल्डर की खोज कभी नहीं की जा रही थी। – Kev

1

इन निर्भरता फ़ाइल नाम और पथ (/usr/lib/mysql/libmysqlclient.so.16) शेयर की गई लाइब्रेरी बाइनरी में शामिल किया हुआ है?

हां, वे हो सकते हैं और अक्सर होते हैं। यहां कीवर्ड -rpath है। हालांकि, ld.conf भी इसका कहना है। दुर्भाग्यवश, पूरी प्रणाली काफी जटिल है।

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