我们称它为 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() 。