【发布时间】: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 <filename> 时,会显示几个类名,尽管命令行中有 -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++