clang:从输出中剥离类名

clang: stripping class names from the output

本文关键字:剥离 输出 clang      更新时间:2023-10-16

我使用以下命令行命令(分成几行)使用 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 的一个子类)

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

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

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