Почему GCC может предположить, что VTables заканчиваются на 32-битных адресах - PullRequest
0 голосов
/ 07 мая 2019

Рассмотрим следующую программу:

#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-битном адресе?

1 Ответ

0 голосов
/ 07 мая 2019

Это модель малого кода GCC (-mcmodel=small).Попробуйте добавить -mcmodel=large к опциям компилятора и посмотрите, как вместо этого он выдаст movabsq.

Cudos to Как gcc / clang может считать, что адрес строковой константы 32-битный? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...