假设我正在编写一些C ++程序,我不想要关于程序如何工作的二进制泄漏信息。我知道我们可以从二进制文件中删除符号,但类名仍然可以通过RTTI信息存储和检索。那我怎么能避免呢?如果我需要禁用RTTI,那么什么C ++功能将不再可用?
答案 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_cast
和typeid
。
但是,如果目标是隐藏行为和有关可执行文件的一些信息,我不认为strip
和禁用RTTI是最佳解决方案。这可能是一个好的开始,但要获得真正的二进制保护,您必须看到打包器/可执行保护程序/混淆工具(http://en.wikipedia.org/wiki/Executable_compression)。