从rtti中删除类名

Strip class name from rtti

本文关键字:删除 rtti      更新时间:2023-10-16

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

禁用RTTI时会损失什么取决于编译器(和编译器版本)。

对于gcc 4.5,您可以阅读:

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

适用于Visual Studio 2013:

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

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

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