2010-02-14 19 views
10

Yolunu kullanarak bir dylib sürümünü bulmanın bir yolu var mı? Ben dlopen ile aynı argümanları kabul eden bir şey arıyorum. NSVersionOfRunTimeLibrary'a baktım, ancak belgelerin okunmasından, yolunda belirtilen değil, mevcut dylib dosyasının sürümünü aldığını görüyorum. dlopen kullanarak dylib sürümünü bulma

size Üzerinde

cevap

14

Çalıştır otool -L ederiz ve onun aslında versiyonunu gösterecektir. Ben 10.4 ve 10.5 SDK'larından farklı sürüme sahip olarak libSystem.B seç:

$ 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) 

(ilki 88.3.11 sürümüne sahip nasıl ikinci 111.1.4 sahipken, bakınız). İşte

$ 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 

, dosyalar kendi adlarına sürüm numarası yok: Bu örnek değil bütün kütüphaneler içlerindeki sürüm numarasına sahip dosyalara sembolik bağlantılar olduğunu göstermektedir.

DÜZENLEME: ikinci bir çözüm, kontrol etmek istediğiniz kitaplığı yüklemeye zorladığınız bir sınama programında NSVersionOfRunTimeLibrary kullanmaktır. Aşağıdaki C kaynağından bir program libversion oluşturun:

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

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

Sonra böyle diyoruz:

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

(burada, sürüm numarası onaltılık olarak yazdırılır, ancak ihtiyaçlarına uyum sağlayabilen .)

+2

Çok daha iyi yanıt, silindi. – EightyEight

4

burada NSVersionOfRunTimeLibrary kaynak kodunu kontrol edebilirsiniz: http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp

tha dayanarak if(names_match(install_name, libraryName) == TRUE)'un if(strcmp(_dyld_get_image_name(i), libraryName) == 0) ile değiştiren kendi sürümünüzü oluşturabilirsiniz. Bu, orijinalin tam yol olmadan kitaplık adının beklenmesini, düzeltilmiş sürümün tam yolu beklediği sorunu çözecektir, ancak yüklenen dyliblerde hala arama yapar.

#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

Kısmen cevap veriyorsunuz ama yine de bu çözümün bir parçası olmalı bence. – Till

+0

"Bu, şimdi tam adı beklediği sorunu düzeltir" ile ilgili olarak: Adk gerçekten bir sorun olduğunu sanmıyorum, çünkü adk bir kitaplık sürümünü kendi yoluna (adı da içeren) sorgulamaya çalışıyor. –

İlgili konular