Позиционно-независимый код и vtable

Как реализуются виртуальные функции в позиционно-независимом коде?

Я знаю, что если в моем классе есть виртуальные функции, компилятор обычно генерирует для него виртуальную таблицу, содержащую адреса всех виртуальных функций, и хранит указатель на виртуальную таблицу в каждом объекте моего класса.

Теперь, если мой код не зависит от позиции, компилятор не может знать адреса виртуальных функций (или любой функции, если на то пошло). Так что же он делает?

Я хотел бы знать, что делают настоящие компиляторы (а не то, что теоретически возможно); меня в основном интересуют 32-битные платформы Linux, но и другие платформы тоже немного интересны.


person anatolyg    schedule 21.03.2011    source источник
comment
Компоновщик знает, у него не возникнет проблем с исправлением смещений, если они не пересекают границы модуля. Найти того, кто действительно это делает, будет сложнее.   -  person Hans Passant    schedule 21.03.2011


Ответы (3)


Есть два варианта:

  1. смиритесь с тем, что ваша виртуальная таблица не будет независимой от позиции, и попытайтесь переместить ее из раздела кода, чтобы весь код, требующий исправления динамического связывания, располагался рядом друг с другом, чтобы уменьшить количество страниц, которыми нельзя поделиться. gcc делает это.
  2. использовать относительные переходы в vtable. Я не знаю ни одной реализации, которая делает это, и она работает только до тех пор, пока виртуальная таблица живет с фиксированным смещением от реализаций метода, и их нельзя переопределить во время загрузки (что может быть в типичных системах ELF).
person Simon Richter    schedule 21.03.2011

По сути, виртуальная таблица везде реализуется как таблица указателей на функции.

person MSalters    schedule 21.03.2011

Я предлагаю вам написать несколько примеров программ и проверить их самостоятельно, например, с помощью IDA Pro. Загрузите бесплатную версию или демонстрационная версия.

person activout.se    schedule 21.03.2011