从二进制dll文件中删除C ++类名

时间:2013-02-14 07:18:00

标签: c++ visual-studio-2010 dll linker obfuscation

我在Visual Studio 2010下有一个C ++项目,它编译成一个dll。我在项目中定义了几个私有的特定于实现的类,例如CMyClass。此类不是从dll或任何接口函数导出的。但是,当我检查生成的dll文件时,其中存储了一个字符串“CMyClass”。它是一个发布版本,我不希望这个字符串出现在dll文件中。这个DLL被发送给客户,我希望我在项目中使用的所有名称都被删除掉dll文件,所以没有人可以得到我们在dll中使用的算法的简单线索。

我使用Release配置。在项目属性中,链接器选项卡下的“生成调试信息”选项处于关闭状态,“C / C ++”选项卡下的“调试信息格式”设置为“程序数据库(/ Zi)”。我试图为“调试信息格式”设置空字符串,但没有成功。

在dll中找到的字符串看起来像.?AVCMyClass@@,位于dll文件的最后。它是dll文件中唯一出现的“CMyClass”字符串。但是,几乎所有内部​​类都会显示此字符串。

如何摆脱这些提及?

更新

请注意,我不想混淆源代码本身。提供的链接无关紧要。我没有看到为什么类名存储在dll文件中的原因。我总是可以在构建之前重命名我的类,但这不是一个非常直接的解决方案。

UPDATE2

我不同意社区关闭这个问题,因为这不是重复。答案在Tyler Gill的评论中给出。感谢他,并对其他人感到羞耻。

2 个答案:

答案 0 :(得分:4)

正如我从评论中看到的猜测是正确的,我将此作为答案重新发布。

类名的字符串是为已编译的二进制文件启用RTTI(运行时类型信息)的结果。启用RTTI时,编译器会创建对象,这些对象存储有关编译到二进制文件中的类型的信息,其中一个属性是类型的名称。

请注意,dynamic_casttypeid的某些用法需要RTTI,因此禁用会使您失去C ++的这些功能。

要在Visual Studio中禁用RTTI,请使用/GR-开关(请参阅http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,正如Mikhail发布的那样。)

要在GCC中禁用它,请使用-fno-rtti开关。

答案 1 :(得分:2)

作为评论中提到的Tyler Gill,由于CMyClass实际上继承了IMyClass并且是多态的,因此RTTI会保留此字符串。使用/GR-切换disabling RTTI可以轻松解决我的问题。感谢。