为什么GCC可以假设VTables以32位地址结尾

时间:2019-05-07 12:25:02

标签: gcc

考虑以下程序:

#include <iostream>

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

class B : public A { };

int main() {
    B();
}

GCC(经过测试的4.4.0、8.3.0和9.1)为B::B()godbolt link)生成以下代码:

        call    A::A() [base object constructor]
        movl    $vtable for B+16, %edx

请注意,它在64位程序中执行了32位移动。 GCC如何确保存储vtable的.text节将以32位地址结尾?

1 个答案:

答案 0 :(得分:0)

这是根据GCC的小代码模型(-mcmodel=small)得出的。尝试将-mcmodel=large添加到编译器选项中,看看它如何发出movabsq

How can gcc/clang assume a string constant's address is 32-bit?表示敬意。