2012-09-28 13 views
33

मैंने "Program Library HOWTO" सीखा। यह उल्लेख है कि अनुवर्ती संस्करण का प्रबंधन करने के लिए soname का उपयोग करना।साझा पुस्तकालयों के निर्माण के लिए 'सोनम' विकल्प क्या है?

gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

और मुझे जानकारी मिलती है कि यदि soname सेट नहीं है। यह libfoo.so.1.0.0 के बराबर होगा, here से उत्तर देखें।

और मैं लगता है कि यह भी

gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

निम्नलिखित की तरह soname बिना काम कर सकते हैं, तो मुझे लगता है केवल एक उपयोगी बात यह है कि कि soname विकल्प है जब आप का उपयोग करें यदि आपने साझा लाइब्रेरी के संस्करण बता सकते हैं readelf -d libfoo.so इसे जांचने के लिए कमांड।

यह और क्या कर सकता है?

उत्तर

38

soname का उपयोग यह संकेत करने के लिए किया जाता है कि आपके लाइब्रेरी समर्थन में बाइनरी एपीआई संगतता क्या है।

SONAME पुस्तकालय फ़ाइल से निर्धारित वास्तविक लक्ष्य लाइब्रेरी संस्करण से निर्धारित करने के लिए लिंकर द्वारा संकलन समय पर उपयोग किया जाता है। gcc -l NAME lib NAME की तलाश करेगा। इसलिए लिंक या फ़ाइल उसके सोनेम को कैप्चर करेगी जो निश्चित रूप से अधिक विशिष्ट होगी (ex libnuke.so libnuke.so.0.1.4 के लिंक जो SONAME libnuke.so.0 शामिल हैं)।

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

टिप्पणी: SONAME केवल लिंक/निर्माण समय पर लागू है, न कि रन टाइम पर।

लाइब्रेरी का 'SONAME' 'objdump -p फ़ाइल | grep SONAME' के साथ देखा जा सकता है। 'obeddump -p फ़ाइल | grep की आवश्यकता' के साथ बाइनरी की 'ज़रूरत' देखी जा सकती है।

[संपादित करें] चेतावनी निम्नलिखित सामान्य टिप्पणी है, लिनक्स में तैनात नहीं। अंत में देखें।

मान लेते हैं आप libnuke.so.1.2 नाम के साथ एक पुस्तकालय है और आप एक नया libnuke पुस्तकालय का विकास करते हैं:

  • यदि आपके नए पुस्तकालय एपीआई परिवर्तन के बिना पिछले से एक ठीक है, तो आप सिर्फ एक ही soname रखना चाहिए , फ़ाइल नाम के संस्करण में वृद्धि। यानी फाइल libnuke.so.1.2.1 होगी लेकिन soname अभी भी libnuke होगा .so.1.2।
  • यदि आपके पास एक नई लाइब्रेरी है जो केवल नए फ़ंक्शन को जोड़ती है लेकिन कार्यक्षमता तोड़ती नहीं है और अभी भी पिछली के साथ संगत है, तो आप पिछले प्लस की तुलना में उसी सोनम का उपयोग करना चाहेंगे जैसे कि 1। यानी फ़ाइल और सोनम libnuke.so.1.2.1 होगा। Libnuke.1.2 से जुड़ा कोई भी प्रोग्राम अभी भी उस के साथ काम करेगा। Libnuke.1.2.1 से जुड़े नए प्रोग्राम केवल उस के साथ काम करेंगे (जब तक नया उपखंड libnuke.1.2.1.1 की तरह नहीं आ जाता)।
  • यदि आपके नए पुस्तकालय किसी भी libnuke साथ संगत नहीं है: libnuke.so.2
  • यदि आपके नए पुस्तकालय नंगे पुराने संस्करण के साथ संगत है: libnuke.so.1.3 [यानी अभी भी libnuke.so के साथ संगत।1]

[संपादित करें] पूर्ण करने के लिए: लिनक्स केस।

एक विशिष्ट रूप के रूप में लिनक्स वास्तविक जीवन SONAME में:। lib [NAME] [एपीआई-संस्करण] .so [मेजर संस्करण] प्रमुख-संस्करण केवल एक पूर्णांक मान प्रत्येक प्रमुख पुस्तकालय परिवर्तन में वृद्धि है। एपीआई-संस्करण डिफ़ॉल्ट रूप से रिक्त है

पूर्व libnuke.so.0

तब वास्तविक फ़ाइल नाम लघु संस्करणों और subversions शामिल पूर्व: libnuke.so.0.1.5

मुझे लगता है कि एक soname प्रदान नहीं फाइल का नाम बदलने के बाद से यह एक बुरा अभ्यास है क्योंकि इसका व्यवहार बदल जाएगा।

+1

फिलिप, डेविड ए व्हीलर (http://bit.ly/1CkQJmR) के अनुसार, soname एक एकल संस्करण संख्या, libnuke की तरह है। तो .1 या libnuke.so.4। क्या आपको पता है कि दूसरा संस्करण संख्या वास्तव में soname का हिस्सा हो सकती है, जैसे libnuke.so.1.2? –

+0

खैर, कई अंकों के साथ सोनमा, उदाहरण के लिए openssl लाइब्रेरी के लिए: SONAME: libssl.so.0.9.8, लेकिन आप सही हैं कि यह "प्रोग्राम लाइब्रेरी हाउटो" से अधिक सामान्य है जो वास्तव में –

+0

पर अधिक प्रतिबंधक लगता है यह वर्णन करने के लिए कि फ़ाइल नाम और सोनम को अलग-अलग सेट किया जाना चाहिए, लेकिन आप वर्णन नहीं करते कि बाद के मामलों में सोनम को कैसे सेट किया जाना चाहिए। – poolie

0

एक अन्य पहलू: कम से कम लिनक्स पर SONAME प्रवेश कैसे/lib,/lib64 आदि में उचित लिंक आदेश ldconfig चल रहा है बनाने के लिए पर क्रम-लिंकर प्रणाली के लिए एक संकेत प्रदान करता है नाम के एक प्रतीकात्मक कड़ी बनाने की कोशिश सोनम के साथ जिसे रन-टाइम लिंकर कैश में भी ले जाया जाता है। उसी सोनामे को टैग करने वाले पुस्तकालयों में से सबसे नया लिंक-रेस जीतता है। यदि कुछ सॉफ़्टवेयर विशिष्ट सोनामे पर निर्भर करता है और आप लाइब्रेरी को नवीनीकृत करना चाहते हैं तो आपको इस नई लाइब्रेरी पर ldconfig छड़ी प्राप्त करने के लिए इस SONAME को प्रदान करना होगा (यदि ldconfig को कैश और लिंक के पुनर्निर्माण के लिए उपयोग किया जाता है)। जैसे libssl.so.6 और libcrypto.so.6 ऐसे मामले हैं।

1

चलो libA.so libb.so पर निर्भर करता है, और वे सभी एक निर्देशिका में (निश्चित रूप से निर्देशिका गतिशील लिंकर द्वारा नहीं मिल सकती है)। आप soname सेट नहीं किया है तो dlopen काम नहीं करता:

auto pB = dlopen("./libB.so", RTLD_LAZY | RTLD_GLOBAL); 
auto pA = dlopen("./libA.so", RTLD_LAZY | RTLD_GLOBAL); 

क्योंकि क्रम लिंकर libB.so नहीं मिल रहा है, तो pANULL को तैयार है।

इस मामले soname नरक से आप को बचाने के लिए होगा ...

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