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