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 .)
Nguồn
2010-03-03 21:12:39
Câu trả lời hay hơn nhiều, đã xóa của tôi. – EightyEight