x.dylib としましょう。x.dylib を時々ロードしたいだけです。
dylib の初期化で、x.dylib をロードしようとした dlopen() 呼び出しが x.dylib のロードに失敗して NULL を返す原因となるロジックを持つ方法はありますか?
x.dylib の名前を変更することはオプションではありません。
http://opensource.apple.com/source/dyld/dyld-210.2.3/src/dyldAPIs.cppを調べましたが、コードに慣れていません。
たぶんこれでうまくいくと思いました:
__attribute__((constructor))
void initializer(void) {
fprintf(stderr, "initializer\n");
throw;
}
しかし、その初期化子を使用して dylib で dlopen() を呼び出すと、" initializer
terminate called without an active exceptionAbort trap: 6
"が返されます。
だから私は困惑しています。どんな助けでも素晴らしいでしょう。
編集: gdb で表示した場合のスタック トレースは次のとおりです。
Program received signal SIGABRT, Aborted.
0x00007fff9128a82a in __kill ()
(gdb) bt
#0 0x00007fff9128a82a in __kill ()
#1 0x00007fff93539a9c in abort ()
#2 0x00007fff987f07bc in abort_message ()
#3 0x00007fff987edfcf in default_terminate ()
#4 0x00007fff987ee001 in safe_handler_caller ()
#5 0x00007fff987ee05c in std::terminate ()
#6 0x00007fff987ef152 in __cxa_throw ()
#7 0x0000000100003eb5 in initializer ()
#8 0x00007fff5fc0fda6 in __dyld__ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE ()
#9 0x00007fff5fc0faf2 in __dyld__ZN16ImageLoaderMachO16doInitializationERKN11ImageLoader11LinkContextE ()
#10 0x00007fff5fc0d2e4 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#11 0x00007fff5fc0d27d in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#12 0x00007fff5fc0e0b7 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextERNS_21InitializerTimingListE ()
#13 0x00007fff5fc034dd in __dyld__ZN4dyld24initializeMainExecutableEv ()
#14 0x00007fff5fc0760b in __dyld__ZN4dyld5_mainEPK12macho_headermiPPKcS5_S5_ ()
#15 0x00007fff5fc01059 in __dyld__dyld_start ()
由来:
- http://opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp
- http://opensource.apple.com/source/dyld/dyld-210.2.3/src/ImageLoader.cpp
- http://opensource.apple.com/source/dyld/dyld-210.2.3/src/ImageLoaderMachO.cpp
ただし、スタック トレースに dlopen() が表示されないことに驚いています。