2010-02-14 31 views
10

Có cách nào để tìm phiên bản dylib sử dụng đường dẫn của nó không? Tôi đang tìm một cái gì đó chấp nhận các đối số tương tự như dlopen. Tôi đã nhìn vào NSVersionOfRunTimeLibrary, nhưng từ đọc của tôi về tài liệu có vẻ như nó được phiên bản của dylib hiện tại, không phải là một trong những quy định trong đường dẫn.Tìm phiên bản dylib bằng cách sử dụng dlopen

Cảm ơn bạn

Trả lời

14

Chạy otool -L trên đó và nó sẽ hiển thị phiên bản thực sự của nó. Tôi chọn libSystem.B vì nó có phiên bản khác nhau trong 10.4 và 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) 

(xem cách đầu tiên có phiên bản 88.3.11, trong khi phiên bản thứ nhất có 111.1.4). Ví dụ này cũng cho thấy rằng không phải tất cả thư viện đều là liên kết tượng trưng cho tệp có số phiên bản trong đó:

$ 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 

Ở đây, tệp không có số phiên bản trong tên của chúng.

EDIT: giải pháp thứ hai là sử dụng NSVersionOfRunTimeLibrary trong chương trình thử nghiệm, trong đó bạn bắt buộc tải thư viện bạn muốn kiểm tra. Tạo một chương trình libversion từ nguồn C sau:

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

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

Sau đó, bạn gọi nó như thế:

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

(ở đây, số phiên bản được in như hệ thập lục phân, nhưng bạn có thể thích ứng với nhu cầu của bạn .)

+2

Câu trả lời hay hơn nhiều, đã xóa của tôi. – EightyEight

4

Bạn có thể kiểm tra mã nguồn của NSVersionOfRunTimeLibrary đây: http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp

Dựa trên tha Bạn có thể tạo phiên bản của riêng bạn thay thế if(names_match(install_name, libraryName) == TRUE) bằng if(strcmp(_dyld_get_image_name(i), libraryName) == 0) Điều đó sẽ khắc phục vấn đề ban đầu dự kiến ​​tên thư viện mà không có đường dẫn đầy đủ, phiên bản đã chỉnh sửa mong đợi đường dẫn đầy đủ, nhưng nó vẫn sẽ tìm kiếm trong các dylib được tải.

#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

Bạn đang trả lời một phần nhưng điều này vẫn là một phần của giải pháp, tôi nghĩ vậy. – Till

+0

Về "Điều đó sẽ khắc phục vấn đề bây giờ nó dự kiến ​​tên đầy đủ": Tôi không nghĩ rằng đó thực sự là một vấn đề, vì adk đang cố gắng truy vấn phiên bản thư viện theo đường dẫn của nó (bao gồm tên). –

Các vấn đề liên quan