1

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 ()

由来:

ただし、スタック トレースに dlopen() が表示されないことに驚いています。

4

0 に答える 0