Osx पर .so और .dylib के बीच अंतर क्या हैं?


214

.dylib OSX पर डायनेमिक लाइब्रेरी एक्सटेंशन है, लेकिन यह मेरे लिए कभी भी स्पष्ट नहीं है जब मैं एक पारंपरिक यूनिक्स .so साझा ऑब्जेक्ट का उपयोग नहीं कर सकता / करूं।

मेरे पास कुछ प्रश्न हैं:

  • एक वैचारिक स्तर पर, .so और .dylib के बीच मुख्य अंतर क्या हैं?
  • मुझे कब एक का उपयोग करना चाहिए?
  • संकलन ट्रिक्स और टिप्स (उदाहरण के लिए, gcc -sared -fPIC के लिए प्रतिस्थापन, क्योंकि यह osx पर काम नहीं करता है)

जवाबों:


206

मैक ओएस एक्स द्वारा निष्पादन योग्य और पुस्तकालयों के लिए प्रयुक्त मैक-ओ ऑब्जेक्ट फ़ाइल प्रारूप साझा पुस्तकालयों और गतिशील रूप से लोड किए गए मॉड्यूल के बीच भिन्न होता है । का otool -hv some_fileफ़िलाटाइप देखने के लिए उपयोग करें some_file

माच-ओ साझा पुस्तकालयों में फ़ाइल प्रकार होता है MH_DYLIBऔर एक्सटेंशन .dylib को ले जाता है। उन्हें सामान्य स्थिर लिंकर झंडे के साथ जोड़ा जा सकता है, उदाहरण के -lfooलिए libfoo.dylib। वे -dynamiclibध्वज को संकलक को पास करके बनाया जा सकता है । ( -fPICडिफ़ॉल्ट है और निर्दिष्ट नहीं किया जाना चाहिए।)

लोड करने योग्य मॉड्यूल को माच-ओ स्पीक में "बंडल्स" कहा जाता है। उनके पास फ़ाइल प्रकार है MH_BUNDLE। वे कोई भी विस्तार कर सकते हैं; एक्सटेंशन .bundleकी अनुशंसा Apple द्वारा की जाती है, लेकिन अधिकांश पोर्टेड सॉफ़्टवेयर .soसंगतता के लिए उपयोग करता है । आमतौर पर, आप प्लग-इन के लिए बंडल का उपयोग करेंगे जो एक एप्लिकेशन का विस्तार करता है; ऐसी स्थितियों में, बंडल अनुप्रयोग के निर्यात एपीआई तक पहुंच प्राप्त करने के लिए एप्लिकेशन बाइनरी के खिलाफ लिंक करेगा। वे -bundleध्वज को संकलक को पास करके बनाया जा सकता है ।

दोनों dylibs और बंडलों को गतिशील रूप से dlAPIs (जैसे dlopen, dlclose) का उपयोग करके लोड किया जा सकता है । बंडलों के खिलाफ लिंक करना संभव नहीं है जैसे कि वे साझा पुस्तकालय थे। हालांकि, यह संभव है कि एक बंडल वास्तविक साझा पुस्तकालयों के खिलाफ जुड़ा हुआ है; बंडल लोड होने पर वे स्वचालित रूप से लोड हो जाएंगे।

ऐतिहासिक रूप से, अंतर अधिक महत्वपूर्ण थे। मैक ओएस एक्स 10.0 में, पुस्तकालयों को गतिशील रूप से लोड करने का कोई तरीका नहीं था। Dyld APIs (उदाहरण NSCreateObjectFileImageFromFileके लिए NSLinkModule) का एक सेट बंडल को लोड करने और उतारने के लिए 10.1 के साथ पेश किया गया था, लेकिन उन्होंने dylibs के लिए काम नहीं किया। dlopenबंडलों के साथ काम करने वाली एक अनुकूलता पुस्तकालय 10.3 में जोड़ा गया था; 10.4 में, dlopenडाइल्ड का मूल हिस्सा होने के लिए फिर से लिखा गया और लोडिंग (लेकिन उतराई नहीं) के लिए समर्थन जोड़ा गया। अंत में, 10.5 ने dlcloseडाइलिब के साथ उपयोग के लिए समर्थन जोड़ा और डाइल्ड एपीआई को हटा दिया।

लिनक्स जैसी ईएलएफ प्रणालियों पर, दोनों एक ही फ़ाइल प्रारूप का उपयोग करते हैं ; साझा कोड के किसी भी टुकड़े का उपयोग पुस्तकालय के रूप में और गतिशील लोडिंग के लिए किया जा सकता है।

अंत में, ध्यान रखें कि मैक ओएस एक्स में, "बंडल" एक मानकीकृत संरचना के साथ निर्देशिकाओं को भी संदर्भित कर सकता है जो निष्पादन योग्य कोड और उस कोड द्वारा उपयोग किए गए संसाधनों को रखता है। कुछ वैचारिक ओवरलैप हैं (विशेष रूप से प्लग-इन जैसे "लोड करने योग्य बंडलों" के साथ, जिसमें आमतौर पर मच-ओ बंडल के रूप में निष्पादन योग्य कोड होता है), लेकिन उन्हें ऊपर चर्चा किए गए मच-ओ बंडलों के साथ भ्रमित नहीं होना चाहिए।

अतिरिक्त संदर्भ:


1
इस व्यापक टिप्पणी के लिए धन्यवाद :) क्या मैं इसे सही ढंग से समझता हूं, कि अगर मैं एक बंडल को दूसरे बंडल से लोड करता हूं (यानी पथ ऐप है -> बंडल ए -> बंडल बी), तो बंडल बी कोई भी नहीं देख पाएगा बंडल ए में प्रतीक? और यदि हाँ, तो क्या किसी भी तरह से इसे हल करने का कोई तरीका है? मैंने अभी इसे हिट किया है, मुझे लगता है: stackoverflow.com/questions/4193539/…
मिखाइल एडोशिन

4
@noloader: -dynamiclibएक GCC झंडा है। यह संकलक -dylibको ld बनाता है ।
माइल्स

मैक ओएसएक्स पर ld के लिए मैन पेज के लिए अपडेट किया गया URL: manpages.info/macosx/ld.1.html
netpoetica

18

फ़ाइल .so साझा लाइब्रेरी के लिए UNIX फ़ाइल एक्सटेंशन नहीं है।

यह सिर्फ एक आम बात है।

ArnaudRecipes साझा सूची पेज पर लाइन 3 बी की जाँच करें

मूल रूप से .dylib एक मैक फ़ाइल एक्सटेंशन है जिसका उपयोग साझा लिब को इंगित करने के लिए किया जाता है।


9
@ninefingers। सही बात। लेकिन कुछ उपकरण डिफ़ॉल्ट मानों का उपयोग करेंगे जब तक कि कुछ बहुत स्पष्ट न हो। जैसे कंपाइलर वहाँ प्लेटफ़ॉर्म विशिष्ट साझा लाइब्रेर एक्सटेंशन का उपयोग करेगा जब -l <lib> ध्वज का उपयोग किया जाता है (वास्तविक ध्वज कंपाइलरों में बहुत हो सकता है)।
मार्टिन यॉर्क

14

मैक ओएस एक्स पर .dylib और .so के बीच अंतर यह है कि उन्हें कैसे संकलित किया जाता है। .So फ़ाइलों के लिए आप का उपयोग करें -sared और .dylib के लिए आप -dynamiclib का उपयोग करें। .So और .dylib दोनों गतिशील लाइब्रेरी फ़ाइलों के रूप में विनिमेय हैं और या तो DYLIB या BUNDLE के रूप में टाइप हैं। यह दिखाने वाली विभिन्न फ़ाइलों के लिए रीडआउट का उपयोग करता है।

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

मैक ओएस एक्स पर दो समान हैं इसका कारण अन्य यूनिक्स ओएस प्रोग्राम के साथ पीछे की संगतता है जो कि .so फ़ाइल प्रकार के लिए संकलित है।

संकलन नोट: चाहे आप एक .so फ़ाइल या एक .dylib फ़ाइल संकलित करते हैं, आपको लिंकिंग चरण के दौरान डायनेमिक लाइब्रेरी में सही पथ सम्मिलित करने की आवश्यकता होती है। आप इसे जोड़ने-स्थापना_नाम और लिंकिंग कमांड के फ़ाइल पथ को जोड़कर करते हैं। यदि आप ऐसा नहीं करते हैं, तो आप इस पोस्ट में देखी गई समस्या में भाग लेंगे: मैक डायनामिक लाइब्रेरी क्रेज़नेस (केवल फोरट्रान ओनली)


मैं बंडल फ़ाइलों के बजाय फ़ाइलों ./configureको कैसे बना सकता हूं ? यह कार्य नहीं करता है। .dylib.so./configure --enable-shared
एडमिया

मेरे अनुभव से मैक पर अधिकांश कॉन्फ़िगरेशन फ़ाइलें या तो एक .so फ़ाइल या एक स्थिर लायब्रेरी फ़ाइल का निर्माण करेंगी क्योंकि कॉन्फ़िगरेशन फ़ाइलें मानक यूनिक्स / लिनक्स फ़ाइल नामों का उपयोग कर रही हैं।
ज़चारी क्रूस

4

बस एक अवलोकन जो मैंने अभी-अभी बनाया है OSX पर भोले कोड को सीमेक के साथ:

cmake ... -DBUILD_SHARED_LIBS=OFF ...

.so फाइलें बनाता है

जबकि

cmake ... -DBUILD_SHARED_LIBS=ON ...

.dynlib फ़ाइलें बनाता है ।

शायद इससे किसी को मदद मिले।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.