是否可以访问实现的 vtbl?

Is it possible to access implementation's vtbl?

本文关键字:vtbl 实现 访问 是否      更新时间:2023-10-16

我正在阅读Scott Myerses的c++,他说通常当我们将成员函数设为虚函数时,我们的类将在其成员之外包含一个指向所谓虚函数表的指针。有可能访问这个指针吗?我理解它的实现细节,但也许我们可以用g++或clang来做。

另一种简单的方法是使用http://gcc.godbolt.org -它允许您输入程序并查看gcc生成的x86汇编(或者,尝试使用您自己的编译器-S/S (vc++))。我把这个程序放在:

struct X
{
    virtual ~X() { }
    virtual void f() { }
};
int main()
{
  X x;
}

点击"指令",它显示的虚表信息如下…

.LFE5:
    .size   main, .-main
    .weak   vtable for X
    .section    .rodata._ZTV1X,"aG",@progbits,vtable for X,comdat
    .align 32
    .type   vtable for X, @object
    .size   vtable for X, 40
vtable for X:
    .quad   0
    .quad   typeinfo for X
    .quad   X::~X()
    .quad   X::~X()
    .quad   X::f()
    .weak   typeinfo name for X
    .section    .rodata._ZTS1X,"aG",@progbits,typeinfo name for X,comdat
    .type   typeinfo name for X, @object
    .size   typeinfo name for X, 3
typeinfo name for X:
    .string "1X"
    .weak   typeinfo for X
    .section    .rodata._ZTI1X,"aG",@progbits,typeinfo for X,comdat
    .align 16
    .type   typeinfo for X, @object
    .size   typeinfo for X, 16
typeinfo for X:
    .quad   vtable for __cxxabiv1::__class_type_info+16
    .quad   typeinfo name for X
    .text