2012-04-07 6 views
10

После аккуратной отладки, я обнаружил ошибку в моем приложении, которое коренится в рамках системы загрузки багги компании Apple свертка:Может ли приложение Mac OS X предотвращать загрузку библиотеки dlopen?

/System/Library/CoreServices/MLTEFile.bundle 

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

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

+0

Я полагаю, инженеры Apple хотели бы знать, какие у вас проблемы с этим. Звуки * super * -weird. Отправьте ссылку на (Открыть) радар, когда у вас появится шанс подать сообщение об ошибке! – cbowns

ответ

6

Благодаря множеству полезных ответов на Твиттер, я могу предложить функцию «вставить» 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, но мне не ясно, не вызывает ли это интерполяция.