如何从OS X二进制文件中删除Objective-C符号?

如何从OS X二进制文件中删除Objective-C符号?,第1张

概述好的,我知道有一些关于如何实际上不能从OS X二进制文件中剥离Objective-C符号的其他帖子,因为它们是Obj-C所必需的,但是我的情况有所不同. 我有一个单一的二进制是一个捆绑.它旨在用作VST插件或AudioUnit插件.这个想法是,该二进制文件包含两种格式的所有入口点,您只需编译一次,然后将一个副本命名为“.vst”作为VST版本,“.component”为AU版本. (这是使用JUC 好的,我知道有一些关于如何实际上不能从OS X二进制文件中剥离Objective-C符号的其他帖子,因为它们是Obj-C所必需的,但是我的情况有所不同.

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

问题是,对于AU端,您必须导出一个Obj-C类来创建Cocoa UI视图.在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_$_JuceDemoProjectAU0000000000b023c0 (__DATA,__objc_data) external _OBJC_MetaCLASS_$_JuceDemoProjectAU

有任何想法吗?

BTW,我随后能够动态地注册有问题的类(使用唯一的名称),这也解决了这个问题.但是,如果我可以使用Strip,我可以为现有的二进制文件部署一个解决方案.

解决方法 你不能简单地从二进制文件中剥离一个类.然而,您可以做的是欺骗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初始化将被忽略,您将看不到此错误消息:类JuceDemoProjectAU在… / VSTPlugin和… / AUPlugin中实现.其中一个将被使用.哪一个是未定义的

当心,你应该真的不用这个伎俩!您的问题的适当解决方案是编译两个不同版本的插件,或者像其他人一样动态地注册类.

总结

以上是内存溢出为你收集整理的如何从OS X二进制文件中删除Objective-C符号?全部内容,希望文章能够帮你解决如何从OS X二进制文件中删除Objective-C符号?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1026766.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存