GCC 发出的那两个 long in vtable 汇编代码是啥? [复制]

Posted

技术标签:

【中文标题】GCC 发出的那两个 long in vtable 汇编代码是啥? [复制]【英文标题】:What are those two long in vtable assembly code emitted by GCC? [duplicate]GCC 发出的那两个 long in vtable 汇编代码是什么? [复制] 【发布时间】:2013-09-04 10:15:17 【问题描述】:

我检查了 GCC 生成的汇编代码是否有以下 C++ 代码 sn-p。

class Interface 
public:
 virtual int f() = 0;
 virtual int g() = 0;
;

class Concrete : public Interface 
public:
 virtual int f();
 virtual int g();
;

Seams每个vtable里面有两个long,汇编代码seam没有用到,那么这两个可行的目的是什么?

          .globl __ZTV8Concrete
          .const_data
          .align 3
  __ZTV8Concrete:
          .long   0   <<<< THOS TWO LONG DOESN"T USED.
          .long   0 
          .long   __ZN8Concrete1gEv
          .long   __ZN8Concrete1fEv
          .globl __ZTV9Interface
          .weak_definition __ZTV9Interface
          .section __DATA,__const_coal,coalesced
          .align 3
  __ZTV9Interface:
          .long   0    <<<< THOS TWO LONG DOESN"T USED ALSO.
          .long   0 
          .long   ___cxa_pure_virtual
          .long   ___cxa_pure_virtual
          .section __TEXT,__textcoal_nt,coalesced,pure_instructions
          .weak_definition        ___x86.get_pc_thunk.cx
          .private_extern ___x86.get_pc_thunk.

构造函数:

  __ZN8ConcreteC1Ev:
  LFB8:
          pushl   %ebp
  LCFI9:
          movl    %esp, %ebp
  LCFI10:
          pushl   %ebx
          subl    $20, %esp
  LCFI11:
          call    ___x86.get_pc_thunk.bx
  L2$pb:
          movl    8(%ebp), %eax
          movl    %eax, (%esp)
          call    __ZN9InterfaceC2Ev
          movl    8(%ebp), %edx
2>        leal    __ZTV8Concrete-L2$pb(%ebx), %eax
          leal    8(%eax), %eax    <<<< SKIP THE TWO 2 LONG for VTABLE
          movl    %eax, (%edx)
          addl    $20, %esp
          popl    %ebx

【问题讨论】:

是源程序集吗?我看到 __ZN8Concrete1gEv... g() 函数? 我不知道 GCC ABI 的血腥细节,但您可能想与虚拟继承进行比较。那时可能会使用这些字段。 你为什么在乎?我认为这不会造成问题? @xanatos,对不起,我在这里放了不正确的源代码版本。我会编辑它,在 f() 声明之后有一个 g()。 【参考方案1】:

两个“空格”中的一个应该用于 RTTI(第二个),另一个用于多重继承(第一个)。例如见http://tinydrblog.appspot.com/?p=89001,或者更好的https://***.com/a/5712953/613130

【讨论】:

以上是关于GCC 发出的那两个 long in vtable 汇编代码是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥gcc会有一个long long的警告?

注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

33 根据 InstanceKlass 查找 vtable 的数据

33 根据 InstanceKlass 查找 vtable 的数据

关于虚函数的两个问题

在 GCC 上设置打包的 long long 的正确对齐以与 avx2 指令一起使用