【发布时间】:2013-01-29 22:46:07
【问题描述】:
我在 Visual Studio 2010 下有一个 C++ 项目,它编译成 dll。我在我的项目中定义了几个专用于实现的私有类,例如CMyClass。此类不是从 dll 或任何接口函数导出的。但是,当我检查生成的 dll 文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在 dll 文件中。此 dll 已交付给客户,我希望将我在项目中使用的所有名称从 dll 文件中删除,因此没有人可以简单地了解我们在 dll 中使用的算法。
我使用发布配置。在项目属性中,链接器选项卡下的“生成调试信息”选项被关闭,C/C++选项卡下的“调试信息格式”设置为“程序数据库(/Zi)”。我尝试为“调试信息格式”设置空字符串,但没有成功。
在 dll 中找到的字符串看起来像 .?AVCMyClass@@,并且位于 dll 文件的最后。它是 dll 文件中唯一出现的“CMyClass”字符串。但是,我几乎所有的内部类都显示了这个字符串。
如何摆脱这些提及?
更新
请注意,我不想混淆源代码本身。提供的链接无关紧要。我只是看不出为什么类名存储在 dll 文件中。我总是可以在构建之前重命名我的类,但这不是很直接的解决方案。
更新2
我不同意社区关闭这个问题,因为这不是重复的。 Tyler Gill 在 cmets 中给出了答案。感谢他,也为别人感到羞耻。
【问题讨论】:
-
"我不希望这个字符串出现在 dll 文件中" 你认为类名被隐藏的确切原因是什么。编译 C++ 代码本身就足够令人困惑!
-
@Ram 因为类的名称对应于我们用来解决问题的算法的名称。我们不希望任何人知道我们使用什么算法。
-
您正在编译的文件是否启用了 RTTI?它创建存储类型信息的对象并将它们添加到二进制文件中,它具有的属性之一是类型的名称。除此之外,似乎混淆是您想要的方式。如果编译器将类名放入二进制文件中,那么它这样做是有原因的。但是您应该能够使用混淆工具为您重命名内部类。
-
@TylerGill 您的猜测实际上是一个答案。如果我使用 /GR- 开关禁用 RTTI,则名称不再出现在 dll 文件中。见msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx如果你愿意,你可以发布一个答案,我会投票+接受它:)
标签: c++ visual-studio-2010 dll linker obfuscation