从rtti中删除类名
Strip class name from rtti
假设我正在编写一些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_cast
和typeid
。
然而,如果目标是隐藏行为和有关可执行文件的一些信息,我不认为strip
和禁用RTTI是最好的解决方案。这可能是一个好的开始,但要有一个真正的二进制保护,你必须看到打包器/可执行保护程序/模糊处理工具(http://en.wikipedia.org/wiki/Executable_compression)。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 从 GCC 可执行文件中删除符号和 RTTI 文本
- 使用条带是否删除二进制文件上的RTTI信息
- 从rtti中删除类名