12

好的,我知道还有其他帖子关于您实际上不能从OS X二进制文件中删除 Objective-C 符号,因为它们是 Obj-C 工作所必需的,但我的情况有点不同。

我有一个二进制文件,它是一个捆绑包。它旨在用作 VST 插件或 AudioUnit 插件。这个想法是二进制文件包含这两种格式的所有入口点,您只需编译一次,然后将一个副本命名为“ .vst ”用于 VST 版本, “. component ”用于AU 版本。 (顺便说一句,这是使用 JUCE 框架。)

问题是对于 AU 端,您必须导出一个 Obj-C 类来创建 CocoaUI视图。在 VST 方面,永远不会使用此类。但是如果你有一个像 Ableton Live 这样的主机,它允许你同时加载同一个插件的 AU 和 VST 版本,现在我们会遇到典型的 Obj-C 命名空间冲突问题。

在 VST 方面,那个特定的 Obj-C 类永远不会被使用。所以我想做的是使用“strip”从生成的二进制文件中剥离那些 Obj-C 类。这仍然保持了只为两种格式编译一次的优势。

无论如何,我已经尝试使用"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 代码。只需更改__objc_imageinfo__objc_imageinfX例如在您的 VST 插件二进制文件中。您可以使用 perl 轻松完成:

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.

当心,你真的不应该使用这个技巧!您的问题的适当解决方案是编译两个不同版本的插件或按照其他人的建议动态注册类。

于 2013-03-20T13:24:22.180 回答
2

去年在 coreaudio-list 上有一个类似的主题:Collision between Cocoa classes for AU and VST plugins

提供的解决方案是动态注册类,这就是您所说的您已经在工作的内容。如果有办法像你想要的那样去除符号,我相信这些人会知道的。

于 2013-03-18T20:02:06.197 回答