Может ли приложение Mac OS X предотвращать загрузку библиотеки dlopen?

После некоторой тщательной отладки я обнаружил ошибку в своем приложении, которая внедрена в системные рамки, загружая багги-пакет Apple:

/System/Library/CoreServices/MLTEFile.bundle

Я уверен, что я не пользуюсь услугами этого пакета, и сомневаюсь, что многие приложения. Фактически, я узнал, изучая сам Xcode, что пучок НЕ МОЖЕТ быть загружен в пространство памяти Xcode, потому что пакет не совместим с Garbage Collection.

В идеале я бы хотел, чтобы этот пакет не загружался в мое приложение. Один из способов сделать это - потребовать GC в моем собственном приложении, но я не собираюсь это делать. Может ли кто-нибудь подумать о возможности обойти попытки системных фреймворков для вызова dlopen() в этой библиотеке?

Ответ 1

Благодаря множеству полезных ответов на 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

Меня немного путают различные подходы, продемонстрированные здесь. Кажется, что существует механизм для рекламы желания _interpose в таблице имен DYLD и полностью (?) Другого механизма, который полагается на использование dlsym (RTLD_NEXT,...) для перехода к оригиналу. В Apple, загружаемом примере (из первой ссылки на документацию), они используют технику dlsym, но мне это не ясно, если это неявно вызывает возникновение интерполяции.