ZTV,ZTS,ZTI在gdb x / nfu“vtable_address”的结果中意味着什么?

时间:2018-03-20 09:52:47

标签: c++ assembly gdb vtable name-mangling

1。代码

class Parent {
 public:
  virtual void Foo() {}
  virtual void FooNotOverridden() {}
};

class Derived : public Parent {
 public:
  void Foo() override {}
};

int main() {
  Parent p1, p2;
  Derived d1, d2;
}

2。 gdb命令

(gdb) x/300xb 0x400b30

0x400b30是d's vtable的第一个地址。

3。 gdb结果

0x400b30 <_ZTV7Derived>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x400b38 <_ZTV7Derived+8>:  0x80    0x0b    0x40    0x00    0x00    0x00    0x00    0x00
0x400b40 <_ZTV7Derived+16>: 0x60    0x0a    0x40    0x00    0x00    0x00    0x00    0x00
0x400b48 <_ZTV7Derived+24>: 0x70    0x0a    0x40    0x00    0x00    0x00    0x00    0x00
0x400b50 <_ZTS7Derived>:    0x37    0x44    0x65    0x72    0x69    0x76    0x65    0x64
0x400b58 <_ZTS7Derived+8>:  0x00    0x36    0x50    0x61    0x72    0x65    0x6e    0x74
0x400b60 <_ZTS6Parent+7>:   0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x400b68 <_ZTI6Parent>: 0x70    0x20    0x60    0x00    0x00    0x00    0x00    0x00

4。问题

_ZTV _ZTS _ZTI <_ZTV7Derived><_ZTS7Derived><_ZTI6Parent>中的含义是什么?

1 个答案:

答案 0 :(得分:6)

这是您的开发平台破坏C ++符号名称的方式。您可以使用GNU Binutils中的c++filt命令行工具查找:

$ c++filt _ZTV7Derived
vtable for Derived
$ c++filt _ZTS7Derived
typeinfo name for Derived
$ c++filt _ZTI6Parent
typeinfo for Parent

更具体地说,它是由Itanium或IA-64 C ++ ABI定义的修改,也用于x86_64(因为System V Application Binary Interface - AMD64 Architecture Processor Supplement在第9.1节中标题为&#34; C ++&#34 )。有关确切的重整详细信息,请参阅Itanium C ++ ABI中的section on "Virtual Tables and RTTI"