Рассмотрим следующую программу:
#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()
( Годболт ссылка ):
call A::A() [base object constructor]
movl $vtable for B+16, %edx
Обратите внимание, что он выполняет 32-битное перемещение в 64-битной программе.Как GCC может быть уверен, что секция .text
, хранящая vtable, окажется в 32-битном адресе?