2013-03-05 80 views
12

OK,我知道已经有关于如何你不能真正从OS X二进制剥离Objective-C的符号,因为他们需要的对象 - 在所有的工作的其他职位,但我的情况有点不同。如何从OS X二进制文件中去除Objective-C符号?

我有一个单一的二进制文件是一个包。它旨在用作VST插件或AudioUnit插件。这个想法是二进制包含所有这两种格式的入口点,你只编译一次,然后名称以“.VST”一个副本的VST版本,“.component”为AU版本。 (这是BTW使用JUCE框架。)

的问题是,非盟一面,你必须导出一个OBJ-C类用于创建可可UI视图。在VST方面,这个类永远不会被使用。但是如果你有像Ableton Live这样的主机,它允许你同时加载同一个插件的AU和VST版本,现在我们遇到了典型的Obj-C命名空间碰撞问题。

在VST方面,该特定对象 - 类将永远不会被使用。所以我想要做的就是使用“strip”从生成的二进制文件中去除这些Obj-C类。这仍然保持了为这两种格式编译所有内容的优势。

无论如何,我已经尝试使用"strip -R stripfile.txt <path to binary>",其中stripfile.txt包含我想剥离的符号,但它总是失败,说在符号不能在二进制文件中找到。我已经尝试在条形文件中加入名称,但这没有帮助(或者我做错了)。

这里是我想要去除的相关符号,如 “纳米-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 

任何想法?

顺便说一句,我后来之所以能够动态地注册有问题的类(使用一个唯一的名称),这也解决了这个问题。但是,如果我可以使用strip,我可能会为现有的二进制文件部署解决方案。

+6

只是不编译它们并将它们链接到AU/VST中 - 首先设置多个目标。 – justin 2013-03-05 06:51:37

+1

我知道我可以这样做,事实上如前所述,我已经通过动态注册有问题的类来工作,这很好,因为它仍然允许编译所有内容并且不会有单独的目标/二进制文件 - 生成的二进制文件可以仍然可以用作AU或VST(不能通过不编译它为VST方法来实现)。我仍然很好奇,是否有任何方法可以从现有的二进制文件中去除Obj-C二进制文件,因为这样可以在我的“更好”修复程序准备发布之前修复现有的现场安装。 – jimw 2013-03-05 11:16:51

+0

删除符号不会删除类结构,因此它可能不会阻止加载类(我不知道运行时如何找到类,但搜索符号将比仅仅查看保留的部分更难用于课堂信息)。您可以尝试更改二进制文件中类的名称,但必须注意不要影响其他任何内容。我同意justin编译两次是最好的选择,因为它比动态注册更容易。 – ughoavgfhw 2013-03-13 19:46:13

回答

3

你不能简单地从二进制文件中剥离一个类。然而,你可以做的是欺骗Objective-C运行库,使其相信你的插件不包含任何Objective-C代码。例如,在您的VST插件二进制文件中,只需将__objc_imageinfo更改为__objc_imageinfX即可。你可以用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.

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

+0

由于某些原因,我无法完成此工作,即使在执行该命令后,Objective C符号仍保留在二进制文件中。原则上,好主意。 – Perception 2013-03-20 13:45:41

+0

我忘了提及这个假设64位插件。对于32位插件,您可能需要将“__image_info”更改为“__image_infX”。 – 0xced 2013-03-20 13:56:50

相关问题