g++ - 虚拟方法在生成的二进制文件中创建我无法隐藏的符号

g++ - Virtual methods creates symbols in generated binary I can't hide

我正在编译一个库,我需要隐藏尽可能多的信息 在二进制文件中(不透露使用的方法)。我正在使用像 strip 这样的工具 这样做,但是当 运行 生成库上的 strings 工具时, 我一直在寻找包含我的一些 classes 名称的符号。 有关的 class 是使用虚拟方法的。

让我们来说明问题。

我想编译以下程序并隐藏 class AB 在二进制中:

namespace test {

class A {
 public:
  virtual void foo() {};
};

class B: public A { 
};

}

int main(int argc, char **argv) {
  test::B b;
  b.foo();
  return 0;
}

我正在用 g++ 编译它:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
$ g++ main.cpp

如果我查找与 test 命名空间相关的所有符号,我会得到以下结果:

$strings a.out | grep test
N4test1BE
N4test1AE
_ZN4test1AC2Ev
_ZN4test1A3fooEv
_ZTVN4test1BE
_ZN4test1BC1Ev
_ZTIN4test1BE
_ZTVN4test1AE
_ZTSN4test1AE
_ZTIN4test1AE
_ZN4test1AC1Ev
_ZTSN4test1BE
_ZN4test1BC2Ev

我了解到以_Z开头的符号与 不同的 class 方法(即使我不确定两者之间的区别 _ZN_ZTV_ZTI_ZTS)。但我不明白这两个是什么 符号 N4test1BEN4test1AE.

如果我去掉所有的符号:

$ strip --strip-all --discard-all a.out 
$ strings a.out | grep test
N4test1BE
N4test1AE

我无法删除那两个符号。

有人可以帮助我了解它们是什么以及如何从二进制文件中删除它们吗?

我的直觉是它与 VTable 有关,但我真的不知道它是如何工作的。

提前致谢!

这些字符串来自 run-time 类型信息 (RTTI)。具体来说,它们使 typeid(obj).name() 到 return 成为一个识别名称。

如果您不需要它,可以使用 -fno-rtti 将其关闭。请注意,某些标准 C++ 功能需要 RTTI。禁用它时,您得到的不是 C++,您可能需要调整一些代码以使其正常工作。