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

Mik*_*ail 7 c++ dll obfuscation linker visual-studio-2010

我在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在评论中给出了答案.感谢他并且对别人感到羞耻.

小智 6

由于我对评论的猜测似乎是正确的,因此我将其重新发布为答案。

类名字符串是为编译的二进制文件启用 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开关。