gdbx/nfu"vtable_address"结果中的ZTV,ZTS,ZTI是什么意思?
What does ZTV,ZTS,ZTI mean in the result of gdb x/nfu "vtable_address"?
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的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>
?
这是您的开发平台破坏 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 上使用(因为 Itanium C++ ABI 中的 System V Application Binary Interface - AMD64 Architecture Processor Supplement says so in section 9.1 titled "C++"). See section on "Virtual Tables and RTTI" 提供了确切的重整细节.
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的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>
?
这是您的开发平台破坏 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 上使用(因为 Itanium C++ ABI 中的 System V Application Binary Interface - AMD64 Architecture Processor Supplement says so in section 9.1 titled "C++"). See section on "Virtual Tables and RTTI" 提供了确切的重整细节.