12

OK、Obj-Cがまったく機能するために必要なため、 OS XバイナリからObjective-Cシンボルを実際に削除できない方法について他の投稿があることは知っていますが、私の場合は少し異なります。

バンドルである単一のバイナリがあります。VSTプラグインまたはAudioUnitプラグインとして使用することを目的としています。バイナリには両方のフォーマットのすべてのエントリポイントが含まれており、一度コンパイルしてから、VSTバージョンの場合は「.vst」、AUバージョンの場合は 「 .component 」で1つのコピーに名前を付けるという考え方です。(これはJUCEフレームワークを使用しています。)

UI問題は、AU側の場合、Cocoaビューを作成するためにObj-Cクラスをエクスポートする必要があることです。VST側では、このクラスは使用されません。しかし、同じプラグインのAUバージョンとVSTバージョンの両方を同時にロードできるAbleton Liveのようなホストがある場合、典型的なObj-C名前空間の衝突の問題が発生します。

VST側では、その特定のObj-Cクラスが使用されることはありません。したがって、私がやりたいのは、「strip」を使用して、結果のバイナリからこれらのObj-Cクラスを削除することです。これでも、両方の形式ですべてを1回コンパイルするだけの利点が維持されます。

とにかく、"strip -R stripfile.txt <path to binary>"stripfile.txtに削除したいシンボルが含まれている、を使用してみましたが、バイナリにシンボルが見つからないと常に失敗します。ストリップファイルの名前を操作しようとしましたが、それは役に立ちません(または間違っています)。

「nm-m」によって出力される、削除したい関連するシンボルは次のとおりです。

000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description]
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion]
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:]
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU

何か案は?

ところで、私はその後、問題のクラスを(一意の名前を使用して)動的に登録することができました。これも問題を解決します。ただし、ストリップを機能させることができれば、フィールドにすでに存在するバイナリのソリューションを展開できる可能性があります。

4

2 に答える 2

3

バイナリからクラスを単純に削除することはできません。ただし、できることは、Objective-C ランタイムをだまして、プラグインに Objective-C コードが含まれていないと信じ込ませることです。たとえば、VST プラグイン バイナリに変更__objc_imageinfoするだけです。__objc_imageinfXperlで簡単にできます:

perl -pi -e 's/__objc_imageinfo/__objc_imageinfX/g' <path to binary>

VST プラグインにパッチを適用すると、Objective-C のすべての初期化がバイパスされ、次のエラー メッセージが表示されなくなります。Class JuceDemoProjectAU is implemented in both …/VSTPlugin and …/AUPlugin. One of the two will be used. Which one is undefined.

注意してください、あなたは本当にこのトリックを使うべきではありません! 問題の適切な解決策は、プラグインの 2 つの異なるバージョンをコンパイルするか、他の人が提案したようにクラスを動的に登録することです。

于 2013-03-20T13:24:22.180 に答える
2

昨年の coreaudio-list に、これに似たスレッドがありました: Collision between Cocoa classes for AU and VST plugins .

提供された解決策は、クラスを動的に登録することでした。これは、すでに作業していると言っています。あなたが望むようにシンボルを剥ぎ取る方法があったとしたら、彼らはそれを知っていたに違いありません。

于 2013-03-18T20:02:06.197 に答える