10

注意深くデバッグした後、バグのあるAppleバンドルをロードするシステムフレームワークに根ざしたアプリケーションのバグを発見しました。

/System/Library/CoreServices/MLTEFile.bundle

私はこのバンドルのサービスの恩恵を受けていないと確信しており、多くのアプリが恩恵を受けているのではないかと疑っています。実際、Xcode自体を調べたところ、バンドルはガベージコレクションと互換性がないため、バンドルをXcodeのメモリスペースにロードできないことがわかりました。

したがって、理想的には、このバンドルがアプリにも読み込まれないようにします。それを行う1つの方法は、自分のアプリでGCを要求することですが、それを行うつもりはありません。誰かがdlopen()このライブラリを呼び出すためのシステムフレームワークによる試みを回避する方法を考えることができますか?

4

1 に答える 1

6

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/

また、interposes を宣言するための簡略化されたマクロを次に示します。

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

ここに示されているさまざまなアプローチに少し混乱しています。DYLD ネームテーブルに _interpose という欲求をアドバタイズするメカニズムと、dlsym(RTLD_NEXT, …) を使用してオリジナルにチェーンスルーすることに依存する完全に (?) 異なるメカニズムがあるようです。Apple のダウンロード可能な例 (最初のドキュメント リンクから) では、dlsym 手法を使用していますが、これが暗黙的に割り込みを発生させるかどうかは明確ではありません。

于 2012-04-07T16:41:40.910 に答える