1

当我使用带有保留符号信息的选项的 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,但我希望这是最后的手段。

4

1 回答 1

3

但我担心 RTTI 信息被保存在其他地方。

这是。

当我要求编译器执行dynamic_cast时,它必须遵守 的合同dynamic_cast,这需要 RTTI。dynamic_cast避免这种情况的唯一方法是有一个编译器设置,当您尝试以这种方式使用时会给出错误或 UB 。编译器有义务按语言提供 RTTI,除非你明确告诉它。

于 2013-07-29T11:48:56.960 回答