C++ VS2010将我的代码编译成几乎可读的代码

4

我尝试使用反编译器“黑掉”自己的应用程序。 我可以清晰地看到函数名称和许多参数名称。

因此,我认为我在编译代码时已经加上了调试信息,尽管它设置为Release。

此外,编译器告诉我一些东西,如

mylib.lib(vq.obj):警告LNK4099:未找到带有“mylib.lib(vq.obj)”或“M:\ myapp \ Release \ vc100.pdb”的PDB“vc100.pdb”;对象将被链接,就好像没有可用的调试信息。

这是VC试图包含一些调试信息的提示吗?

此外,我的解决方案由3个项目组成,编译后形成3个dll。

当我“黑掉”其中一个dll时,我可以在其中看到另外2个dll的函数名称。 我不知道为什么。

有人能告诉我如何使dll难以调试以及如何在dll中“使用”只有dll的函数而不是1个dll中的所有函数。我希望我能解释清楚。

1个回答

5

这是VC尝试包含一些调试信息的提示吗?

是的,实际上这意味着您正在链接带有调试信息的dll。您可以通过将链接器->调试->生成调试信息设置为“否”来禁用它。但请注意,这个选项不会(大约)影响您的dll文件,但它会切换pdb文件的生成。

有两种类型的实体,它们的名称将在dll文件中明确存储:

  • 接口函数
  • 多态类名

你不能摆脱第一个。使用dll的任何人都必须知道接口函数的名称。

但是,您可以禁用第二个。只有当启用了运行时类型信息(RTTI)时,才需要多态类名。这就是您执行dynamic_casttypeid的方式。如果您不需要这些功能,则可以通过转到C/C++->语言->启用运行时类型信息并将其设置为“否”来禁用RTTI。请参见从二进制dll文件中删除C ++类名

编译器将剥离所有其他实体的名称。


通过“接口函数”,我理解为您指的是导出函数。您可以给它们起一个非常简短的名称,或者在.DEF文件的EXPORTS部分中重命名它们,并选择按序号导入它们。 - Roger Lipscombe
“按序号导入它们”?我不知道这个功能。您能否详细说明一下? - Mikhail
2
例如,参见http://blogs.msdn.com/b/peterrosser/archive/2006/02/22/exporteddllfunctions.aspx。 - Roger Lipscombe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接