Как я могу прочитать неполные типы в дампах DWARF?
Например, у нас есть производный класс:
class Base
{
public:
int Base_var1;
int Base_var2;
....
}
class OtherClass : public Base
{
int OtherClass_var1;
int OtherClass_var2;
....
}
OtherClass otherClass();
Мы компилируем это с помощью компилятора GCC и хотим найти всех членов otherClass
объект. Мы получаем следующий дамп DWARF:
<1><20a>: Abbrev Number: 15 (DW_TAG_variable)
<20b> DW_AT_name : otherClass
<211> DW_AT_type : <0x131>
<1><131>: Abbrev Number: 117 (DW_TAG_class_type)
<132> DW_AT_name : OtherClass
<133> DW_AT_declaration : 1
<134> DW_AT_sibling : <0x150>
<2><135>: Abbrev Number: 45 (DW_TAG_member)
<136> DW_AT_name : OtherClass_var1
<137> DW_AT_type : <0x12>
<138> DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8)
......
У нас есть переменная otherClass
, которые имеют тип 0x131
, Этот тип есть DW_AT_declaration
флаг, который означает, что это не полный тип. Введите в 0x131
у всех членов основного класса (OtherClass_var1
а также OtherClass_var2
), но не имею никакой информации о производных членах.
Если продолжить чтение дампа DWARF, то в каком-то месте мы получим это:
<1><500>: Abbrev Number: 150 (DW_TAG_class_type)
<501> DW_AT_specification: <0x131>
<502> DW_AT_byte_size : 2696
<503> DW_AT_containing_type: <0x560>
<504> DW_AT_sibling : <0x36078>
<2><135>: Abbrev Number: 45 (DW_TAG_member)
<136> DW_AT_name : Base_var1
<137> DW_AT_type : <0x12>
<138> DW_AT_data_member_location: 2 byte block: 23 8
.....
Существует определение для нашего базового класса, и это определение имеет DW_AT_specification
тег, который показывает, где найти другую часть этого класса (основная часть).
Как мы можем правильно прочитать это otherClass
объект? В этот момент я должен хранить массив всех типов, и когда я получаю DW_AT_declaration
тег, я должен пройти через массив и найти тип со спецификацией для этого типа.
И как я могу получить абсолютный адрес производных членов? У нас есть абсолютный адрес переменной otherClass
, Тогда член OtherClass_var1
будет иметь тот же адрес, что и otherClass
, член OtherClass_var2
будет иметь адрес OtherClass_var1
плюс размер байта OtherClass_var1
, Но как мы можем рассчитать адрес производных членов Base_var1
а также Base_var2
?
Задача ещё не решена.
Других решений пока нет …