有沒有方法使用它的路徑來查找dylib的版本?我正在尋找一些與dlopen相同的參數。我已經看過NSVersionOfRunTimeLibrary,但是從我閱讀文檔看來,它看起來像獲取當前dylib的版本,而不是路徑中指定的版本。使用dlopen查找dylib版本
謝謝它
有沒有方法使用它的路徑來查找dylib的版本?我正在尋找一些與dlopen相同的參數。我已經看過NSVersionOfRunTimeLibrary,但是從我閱讀文檔看來,它看起來像獲取當前dylib的版本,而不是路徑中指定的版本。使用dlopen查找dylib版本
謝謝它
運行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
,其中您強制加載要檢查的庫。從下面的C源創建程序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
(這裏,版本號被打印爲十六進制的,但你可以適應您的需求。)
您可以檢查NSVersionOfRunTimeLibrary的源代碼在這裏:基於塔 http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp
您可以創建自己的版本,用替換if(strcmp(_dyld_get_image_name(i), libraryName) == 0)
這樣可以解決原始文件預期庫名沒有完整路徑的問題,編輯後的版本需要完整路徑,但它仍然會在加載的dylib中進行搜索。
#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);
}
你在回答部分問題,但我認爲這應該是解決方案的一部分。 – Till 2010-03-06 09:34:08
關於「這將解決現在它期望的全名」的問題:我不認爲這是一個真正的問題,因爲adk試圖通過它的路徑(其中包括名稱)來查詢庫版本。 – 2010-03-06 10:10:54
更好的答案,刪除我的。 – EightyEight 2010-03-04 05:57:17