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

标签 macos cocoa dlopen dyld

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

/System/Library/CoreServices/MLTEFile.bundle

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

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

最佳答案

感谢 Twitter 上的许多有用回复,我能够在这里提供 dyld 的“插入”功能作为潜在的解决方案。搜索“在依赖库中插入函数”:

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

此处的简短示例:

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/

相关文章:

cocoa - 错误 "Create a concrete instance!"

macos - 不要自动切换到更高端的独立GPU

objective-c - NSTableView 与窗口右侧对齐?

xcode - Mavericks 和 XCode 5 下 Sparkle 的 OS X 应用程序更新问题

PHP 不加载 postgresql 扩展 (mac os x)

MatLab 错误 : cannot open with static TLS

C++ 从 void* 转换为 SomeClass*

Android 库 : java. lang.UnsatisfiedLinkError:dlopen 失败:找不到库 "libgnuSTL_shared.so"

swift - 如何在 Swift 中为 Mac OS X 开发一个简单的输入法?

macos - postgresql 客户端溢出