Может ли приложение 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, но мне это не ясно, если это неявно вызывает возникновение интерполяции.