Я изучаю таблицы виртуальных функций и их представление путем анализа двоичного файла простой программы, написанной на Visual C ++ (с некоторыми оптимизациями).
Несколько дней назад я задал этот вопрос , когда застрял в содержимом таблицы виртуальных методов с идентичным сворачиванием COMDAT вкл.
Теперь я застрял в другом: когда я анализирую класс, мне нужно найти его таблицу виртуальных методов. Я могу сделать это, найдя либо RTTITypeDescriptor
, либо _s_RTTIClassHierarchyDescriptor
, найдя перекрестную ссылку на него, что должно привести меня к _RTTICompleteObjectLocator
. Когда я нахожу перекрестную ссылку на Полный локатор объекта, она записывается непосредственно перед VMT (в основном -1-я запись VMT).
Этот подход работает на некоторых классах (их имена начинаются с C
в моей программе). Затем есть классы, которые в начале именуются I
, и я могу связать их с другими классами, начинающимися с C
- например, есть класс CClass
, и он наследуется от IClass
. Эти I
-классы, вероятно, служат интерфейсами для C
-классов и, следовательно, они, вероятно, содержат только абстрактные методы.
Путем поиска перекрестной ссылки на дескриптор типа или дескриптор иерархии классов любого из I
-классов я ничего не могу найти - нет полного локатора объектов, который привел бы меня к VMT класса (это должно быть полные ссылки на pure_virtual
вызовите, если я прав насчет всех абстрактных методов в I
-классах и если я правильно понимаю, как выглядит VMT абстрактного класса).
Почему у I
-классов нет VMT? Оптимизировал ли его компилятор, потому что он был бы полон ссылок на вызов pure_virtual
и управлял им по-другому?