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

时间:2012-04-07 16:15:33

标签: macos cocoa dlopen dyld

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

/System/Library/CoreServices/MLTEFile.bundle

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

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

1 个答案:

答案 0 :(得分: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,...)链接到原始。在Apple的可下载示例中(来自第一个文档链接),他们使用dlsym技术,但我不清楚这是否会隐式导致插入发生。