10

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

/System/Library/CoreServices/MLTEFile.bundle

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

所以理想情况下,我也想阻止这个包被加载到我的应用程序中。一种方法是在我自己的应用程序中要求 GC,但我不打算这样做。任何人都可以想出一种方法来规避系统框架调用dlopen()这个库的尝试吗?

4

1 回答 1

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 技术,但我不清楚这是否隐含地导致了插入的发生。

于 2012-04-07T16:41:40.910 回答