Mac OS X应用程序可以阻止dlopen加载库吗?

dan*_*ass 10 macos cocoa dyld dlopen

经过一些仔细的调试,我发现我的应用程序中存在一个错误,该错误植根于系统框架中,加载了一个有问题的Apple软件包:

/System/Library/CoreServices/MLTEFile.bundle
Run Code Online (Sandbox Code Playgroud)

我相信我没有从这个捆绑的服务中受益,并且怀疑很多应用程序都是.事实上,我通过研究Xcode本身学到了捆绑不能加载到Xcode的内存空间,因为捆绑包不兼容垃圾收集.

理想情况下,我想阻止此捆绑包加载到我的应用程序中.这样做的一种方法是在我自己的应用程序中要求GC,但我不打算这样做.任何人都可以想办法绕过系统框架调用dlopen()这个库的尝试吗?

dan*_*ass 6

感谢Twitter上的一些有用的回复,我能够在这里提供dyld的"插入"功能作为潜在的解决方案.搜索"在从属库中插入函数":

https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/UsingDynamicLibraries.html#//apple_ref/doc/uid/TP40002182-SW10

这里的简短示例:

http://toves.freeshell.org/interpose/

还有一个用于在此处声明设置的简化宏:

http://www.opensource.apple.com/source/dyld/dyld-97.1/include/mach-o/dyld-interposing.h

我对这里展示的各种方法感到有些困惑.似乎有一种机制可以在DYLD名称表中公布_interpose欲,以及一个完全(?)不同的机制,它依赖于使用dlsym(RTLD_NEXT,...)链接到原始.在苹果的下载示例(从第一个文档的链接),他们使用的dlsym的技术,但它不是我清楚,如果这隐含地发生的介入.