2012-04-07 6 views
10

Nach einigen sorgfältigen Debuggen, ich habe einen Fehler in meiner Anwendung entdeckt, die in dem Systemrahmen Laden einen Buggy Apple-Bündels wurzelt:Kann eine Mac OS X-Anwendung verhindern, dass dlopen eine Bibliothek lädt?

/System/Library/CoreServices/MLTEFile.bundle 

Ich bin zuversichtlich, dass ich profitiere bin nicht von den Leistungen dieses Bündels, und bezweifle, dass viele Apps sind. Tatsächlich habe ich gelernt, indem ich Xcode selbst studiert habe, dass das Bündel NICHT in den Speicherplatz von Xcode geladen werden kann, da das Paket nicht mit Garbage Collection kompatibel ist.

Im Idealfall möchte ich verhindern, dass dieses Paket auch in meine App geladen wird. Eine Möglichkeit dazu wäre, GC in meiner eigenen App zu benötigen, aber ich werde das nicht tun. Kann jemand an eine Möglichkeit denken, Versuche von Systemframeworks zu umgehen, um dlopen() auf dieser Bibliothek aufzurufen?

+0

Ich kann mir vorstellen, dass Apple-Ingenieure gerne wissen möchten, welche Probleme Sie damit haben. Geräusche * super * -verdunkelt. Veröffentlichen Sie einen Link zu (Open) Radar, wenn Sie die Möglichkeit haben, einen Fehler zu melden! – cbowns

Antwort

6

Dank einer Reihe nützlicher Antworten auf Twitter kann ich hier die "interpose" -Funktion von dyld als mögliche Lösung anbieten. Suche nach "Zwischenschalten Funktionen in abhängigen Bibliotheken":

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

Kurz Beispiel hier:

http://toves.freeshell.org/interpose/

Und ein vereinfachtes Makro für die Erklärung hier interposes:

http://www.opensource.apple.com/source/dyld/dyld-97.1/include/mach-o/dyld-interposing.h

Ich bin etwas verwirrt wegen der verschiedenen Annäherungen s hier demonstriert. Es scheint, dass es einen Mechanismus gibt, um den _Interpurpose-Wunsch in der DYLD-Namentabelle zu bewerben, und einen vollständig (?) Anderen Mechanismus, der darauf angewiesen ist, dlsym (RTLD_NEXT, ...) zu verwenden, um zum Original zu ketten. In Apples herunterladbarem Beispiel (aus dem ersten Dokumentationslink) verwenden sie die dlsym-Technik, aber es ist mir nicht klar, ob dies implizit die Interposition verursacht.