Позиционно-независимый код и vtable - PullRequest
6 голосов
/ 21 марта 2011

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 21 марта 2011

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

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

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

0 голосов
/ 21 марта 2011

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

...