質問
パスを使用して dylib のバージョンを見つける方法はありますか?dlopenと同じ引数を受け入れるものを探しています。NSVersionOfRunTimeLibrary を調べましたが、ドキュメントを読むと、パスで指定されたバージョンではなく、現在の dylib のバージョンを取得しているようです。
ありがとう
解決
走る otool -L
をクリックすると、実際のバージョンが表示されます。10.4 と 10.5 SDK ではバージョンが異なるため、libSystem.B を選択します。
$ 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 であるのに対し、2 番目のバージョンは 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
ここで、ファイルの名前にはバージョン番号が含まれていません。
編集: 2 番目の解決策は、使用することです NSVersionOfRunTimeLibrary
テスト プログラムで、チェックしたいライブラリを強制的にロードします。プログラムを作成する libversion
以下の C ソースから:
#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
(ここでは、バージョン番号が 16 進数で表示されていますが、必要に応じて調整できます。)
他のヒント
現在のページNSVersionOfRunTimeLibraryのソースコードを確認することができます。 http://www.opensource.apple.com/ソース/ dyldの/ dyldの-132.13 / SRC / dyldAPIsInLibSystem.cppする
あなたはif(names_match(install_name, libraryName) == TRUE)
でif(strcmp(_dyld_get_image_name(i), libraryName) == 0)
を置き換える独自のバージョンを作成することができますに基づいて
これは、元の完全なパスなしでライブラリ名を期待していることの問題を修正する、編集されたバージョンは、完全なパスを期待し、それはまだロードされ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);
}