dlopen

2010-02-14 13 views
10

का उपयोग कर dylib संस्करण ढूँढना क्या इसके पथ का उपयोग कर एक डाइलिब के संस्करण को खोजने का कोई तरीका है? मैं ऐसा कुछ ढूंढ रहा हूं जो डोलपेन के समान तर्क स्वीकार करता हो। मैंने NSVersionOfRunTimeLibrary को देखा है, लेकिन प्रलेखन के मेरे पढ़ने से ऐसा लगता है कि यह वर्तमान डाइलिब का संस्करण प्राप्त करता है, न कि पथ में निर्दिष्ट एक।dlopen

आप उस पर

उत्तर

14

भागो otool -L धन्यवाद, और यह अपने वास्तव में संस्करण दिखाएगा। मैं libSystem.B चयन के रूप में यह 10.4 और 10.5 SDK में अलग संस्करण है:

$ otool -L /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib 
/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11) 
    /usr/lib/system/libmathCommon.A.dylib (compatibility version 1.0.0, current version 220.0.0) 
$ otool -L /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4) 
    /usr/lib/system/libmathCommon.A.dylib (compatibility version 1.0.0, current version 292.4.0) 

(देखते हैं कि कैसे पहले एक 88.3.11 संस्करण है, जबकि दूसरे 111.1.4 है)। यह उदाहरण भी पता चलता है कि नहीं सभी पुस्तकालयों उन में संस्करण संख्या के साथ फ़ाइलें के सांकेतिक लिंक कर रहे हैं:

$ ll /Developer/SDKs/MacOSX10.*.sdk/usr/lib/libSystem.B.dylib 
-rwxr-xr-x 1 root wheel 749K May 15 2009 /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib 
-rwxr-xr-x 1 root wheel 670K May 15 2009 /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib 
-rwxr-xr-x 1 root wheel 901K Sep 25 00:21 /Developer/SDKs/MacOSX10.6.sdk/usr/lib/libSystem.B.dylib 

यहाँ, फ़ाइलें उनके नाम में संस्करण संख्या नहीं है।

संपादित करें: एक दूसरे समाधान एक परीक्षण कार्यक्रम है, जिसमें आप पुस्तकालय आप जाँच करना चाहते हैं लोड मजबूर में NSVersionOfRunTimeLibrary उपयोग करने के लिए है। एक कार्यक्रम libversion बनाएं निम्नलिखित सी स्रोत से:

#include <stdio.h> 
#include <mach-o/dyld.h> 

int main (int argc, char **argv) 
{ 
    printf ("%x\n", NSVersionOfRunTimeLibrary (argv[1])); 
    return 0; 
} 

उसके बाद, आप ऐसा कहते हैं:

$ DYLD_INSERT_LIBRARIES=/usr/lib/libpam.2.dylib ./a.out libpam.2.dylib 
30000 

(यहाँ, संस्करण संख्या हेक्साडेसिमल के रूप में मुद्रित किया जाता है, लेकिन आप अपनी आवश्यकताओं के अनुकूलित कर सकते हैं ।)

+2

अधिक बेहतर उत्तर, हटाया गया मेरा। – EightyEight

4

आप यहाँ NSVersionOfRunTimeLibrary के स्रोत कोड की जांच कर सकते हैं: http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp

था के आधार पर टी if(strcmp(_dyld_get_image_name(i), libraryName) == 0) के साथ if(names_match(install_name, libraryName) == TRUE) को प्रतिस्थापित कर सकता है जो उस समस्या को ठीक करेगा जो मूलभूत पुस्तकालय नाम को पूर्ण पथ के बिना अपेक्षित करता है, संपादित संस्करण पूर्ण पथ की अपेक्षा करता है, लेकिन यह अभी भी लोड किए गए dylibs में खोज करेगा।

#include <mach-o/dyld.h> 
int32_t 
library_version(const char* libraryName) 
{ 
    unsigned long i, j, n; 
    struct load_command *load_commands, *lc; 
    struct dylib_command *dl; 
    const struct mach_header *mh; 

    n = _dyld_image_count(); 
    for(i = 0; i < n; i++){ 
     mh = _dyld_get_image_header(i); 
     if(mh->filetype != MH_DYLIB) 
     continue; 
     load_commands = (struct load_command *) 
#if __LP64__ 
       ((char *)mh + sizeof(struct mach_header_64)); 
#else 
       ((char *)mh + sizeof(struct mach_header)); 
#endif 
     lc = load_commands; 
     for(j = 0; j < mh->ncmds; j++){ 
     if(lc->cmd == LC_ID_DYLIB){ 
      dl = (struct dylib_command *)lc; 
      if(strcmp(_dyld_get_image_name(i), libraryName) == 0) 
      return(dl->dylib.current_version); 
     } 
     lc = (struct load_command *)((char *)lc + lc->cmdsize); 
     } 
    } 
    return(-1); 
} 
+0

आप आंशिक रूप से उत्तर दे रहे हैं लेकिन मुझे लगता है कि यह समाधान का हिस्सा होना चाहिए, मुझे लगता है। – Till

+0

"यह उस मुद्दे को ठीक करेगा जो अब पूर्ण नाम की अपेक्षा करता है": मुझे नहीं लगता कि यह वास्तव में एक मुद्दा है, क्योंकि एडीके अपने पथ से लाइब्रेरी संस्करण से पूछने की कोशिश कर रहा है (जिसमें नाम शामिल है)। –

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