【问题标题】:clang: stripping class names from the outputclang:从输出中剥离类名
【发布时间】:2013-01-28 10:58:07
【问题描述】:

我使用clang++ 构建了我的一个 C++ 项目,使用以下命令行命令(分成几行):

clang++
  -std=c++11
  -W -Wall -Wextra -pedantic -Wno-newline-eof -Werror
  -O4
  -I<dirs>
  -L<dirs>
  -l<libs>
  -framework <frameworks>
  -D <defs>
  -o <filename>
  <files>

但是,当我运行 strings &lt;filename&gt; 时,会显示几个类名,尽管命令行中有 -O4。我试过 -Wl,-s 应该告诉 llvm 去除所有符号,但这并没有删除这些。

出现的类名似乎都有一个共同点:它们都有一个 vtable。其中一类是:

class MyClass {
public:
    virtual void myFunc() = 0;  
};

它显示为符号:

N9namespace7MyClassE

我不喜欢我的命名空间和类名出现在最终文件中。我该如何剥离这些?我的二进制文件是一个命令行实用程序,所以应该只导出main 函数。


即使在提供-fno-rtti(如@n.m. 所建议的那样)之后,仍然保留了一些名称,例如:

__ZN15MyClassInstance6myFuncEv

(MyClassInstance 是上述 MyClass 的子类)

此外,甚至全局变量的名称也在二进制文件中。

【问题讨论】:

  • Windows 还是 Linux?在 linux 上,我会运行“strip myprog”来删除所有符号[共享库不需要的]#
  • 带有-S-x 选项的strip 怎么样?
  • Mac,实际上。我试过strip 但这没有做任何事情。看起来-O4 暗示了-Wl,-s,它执行strip。当我使用-O3 构建时,会出现更多的类名,所以我不得不假设clang 已经在剥离类名方面做得很好,它只是忘记了一些。
  • 您必须至少禁用 RTTI。如果您的程序依赖于 RTTI,那么如果没有源代码级别的混淆,您就无法摆脱这些字符串。
  • @n.m.谢谢,做到了!请将其添加为答案,以便我将其标记为已接受。

标签: c++ clang debug-symbols clang++


【解决方案1】:

我通过提供 clang 参数 -fno-rtti 解决了这个问题,它禁用了 RTTI,这是我无论如何都不使用的 C++ 功能。

[编辑]
看起来-O4 并不暗示strip,并且可以通过执行strip 来删除对我的类名的最后几个引用。

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 2011-12-16
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多