当我使用带有保留符号信息选项的 gcc 编译 C++ 二进制文件时,当我运行以下命令时,它会列出类的类型信息
objdump -Ct ExecName | grep typeinfo
当我使用剥离选项 -s 编译并运行以下命令时,它说没有符号。
但我担心 RTTI 信息被保存在其他地方。
我希望所有类名都不要显示在二进制文件中。我想确认剥离符号是否最终会删除 RTTI 信息。
在 Blackhat 的这个演示中,他们展示了如何使用 RTTI 来了解二进制文件。 http://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf
我知道您可以在编译时使用 -fno-rtti 关闭 RTTI,但我希望这是最后的手段。
最佳答案
But I am worried the RTTI information is being held in some other place.
是的。
当我要求编译器执行dynamic_cast
时,它必须遵守dynamic_cast
的约定,而这需要RTTI。避免这种情况的唯一方法是拥有一个编译器设置,当您尝试以这种方式使用 dynamic_cast
时,它会给出错误或 UB。编译器有义务按语言提供 RTTI,除非您明确告诉它其他方式。
关于c++ - 使用 strip 会删除二进制文件上的 RTTI 信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17923042/