从rtti剥离类名

时间:2014-04-25 23:45:23

标签: c++ c++11

假设我正在编写一些C ++程序,我不想要关于程序如何工作的二进制泄漏信息。我知道我们可以从二进制文件中删除符号,但类名仍然可以通过RTTI信息存储和检索。那我怎么能避免呢?如果我需要禁用RTTI,那么什么C ++功能将不再可用?

1 个答案:

答案 0 :(得分:1)

禁用RTTI时丢失的内容取决于您的编译器(和编译器版本)。

对于gcc 4.5,您可以阅读:

  

-fno-rtti禁止使用虚拟函数生成有关每个类的信息,以供C ++运行时类型标识使用   功能(dynamic_cast' andtypeid')。如果你不使用那些部分   语言,您可以使用此标志来节省一些空间。注意   异常处理使用相同的信息,但它会生成它   如所须。 `dynamic_cast'运算符仍可用于强制转换   不需要运行时类型信息,即转换为void *或   明确的基类。

对于Visual Studio 2013:

  

如果编译器无法静态解析对象类型,请使用/ GR   你的代码。您的代码使用时通常需要/ GR选项   dynamic_cast运算符或typeid。但是,/ GR增加了大小   图像的.rdata部分。如果您的代码不使用   dynamic_cast或typeid,/ GR-可能会产生较小的图像

因此,实际上,在这些情况下,它仅禁用dynamic_casttypeid

但是,如果目标是隐藏行为和有关可执行文件的一些信息,我不认为strip和禁用RTTI是最佳解决方案。这可能是一个好的开始,但要获得真正的二进制保护,您必须看到打包器/可执行保护程序/混淆工具(http://en.wikipedia.org/wiki/Executable_compression)。