经过一些仔细的调试,我在我的应用程序中发现了一个错误,该错误根源于加载有错误的 Apple bundle 的系统框架:
/System/Library/CoreServices/MLTEFile.bundle
我确信我没有从该 bundle 的服务中受益,并且怀疑许多应用程序是否受益。事实上,我通过研究 Xcode 本身了解到,该包无法加载到 Xcode 的内存空间中,因为该包与垃圾收集不兼容。
所以理想情况下,我也想阻止这个包加载到我的应用程序中。一种方法是在我自己的应用程序中要求 GC,但我不打算这样做。有人能想出一种方法来规避系统框架在这个库上调用dlopen()
的尝试吗?
最佳答案
感谢 Twitter 上的许多有用回复,我能够在这里提供 dyld 的“插入”功能作为潜在的解决方案。搜索“在依赖库中插入函数”:
此处的简短示例:
http://toves.freeshell.org/interpose/
还有一个用于在此处声明插入的简化宏:
https://opensource.apple.com/source/dyld/dyld-97.1/include/mach-o/dyld-interposing.h
我对这里演示的各种方法有点困惑。似乎有一种机制可以在 DYLD 名称表中宣传 _interpose 需求,以及一种完全(?)不同的机制,该机制依赖于使用 dlsym(RTLD_NEXT,...) 链接到原始内容。在 Apple 的可下载示例(来自第一个文档链接)中,他们使用 dlsym 技术,但我不清楚这是否隐式导致插入发生。
关于macos - Mac OS X 应用程序可以阻止 dlopen 加载库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10056087/