DWARF читает не завершенные типы

Как я могу прочитать неполные типы в дампах 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?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]