Рассмотрим следующий пример кода дварфа —
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_producer : (indirect string, offset: 0xd): GNU C++ 4.3.0 20080428 (Red Hat 4.3.0-8)
<10> DW_AT_language : 4 (C++)
<11> DW_AT_name : (indirect string, offset: 0x75): test.cpp
<15> DW_AT_comp_dir : (indirect string, offset: 0x4d): /home/dwarf
<19> DW_AT_low_pc : 0x0
<21> DW_AT_high_pc : 0xb
<29> DW_AT_stmt_list : 0x0
<1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
<2e> DW_AT_name : C
<30> DW_AT_byte_size : 8
<31> DW_AT_decl_file : 1
<32> DW_AT_decl_line : 1
<33> DW_AT_sibling : <0x86>
<2><37>: Abbrev Number: 3 (DW_TAG_member)
<38> DW_AT_name : x
<3a> DW_AT_decl_file : 1
<3b> DW_AT_decl_line : 7
<3c> DW_AT_type : <0x86>
<40> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<43> DW_AT_accessibility: 3 (private)
<2><44>: Abbrev Number: 3 (DW_TAG_member)
<45> DW_AT_name : y
<47> DW_AT_decl_file : 1
<48> DW_AT_decl_line : 8
<49> DW_AT_type : <0x86>
<4d> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
<50> DW_AT_accessibility: 3 (private)
Я работал над программой, которая анализирует карликовые файлы, и я не уверен в одной ее части. Если вы заметили, у каждого тега есть дополнительный номер слева от него (в этом примере есть <0> <1> и <2>). Я не совсем уверен, что это такое. Я думаю, что это какой-то уровень стека или что-то, так как <0> дается программе в целом, <1> присваивается классу высшего уровня, и <2> дается его переменным-членам. Тем не менее, я не смог найти что-либо об этом в документация. Для справки вот оригинальная программа —
class C {
public:
C();
C(int x, int y);
int getX();
private:
int x;
int y;
};
class SubC : public C {
int z;
};
int f() {return 0;}
C c;
SubC subC;
int i;
double d;
DWARF DIEs организованы в виде дерева — верхний уровень DW_TAG_compile_unit
для одного файла будет содержать все определения типов (DW_TAG_class_type
например), все функции (DW_TAG_subprogram
) и глобальные / статические переменные (DW_TAG_variable
). Определение класса (DW_TAG_class_type
) будет DIE родителей и содержать таких детей, как DW_TAG_member
для переменных-членов или DW_TAG_subprogram
для методов.
Вывод, который вы добавили, — это способ работы вашего конкретного DWARF-дампера — похоже, он использует это число, чтобы показать отношения родитель / потомок. Это readelf
? Другие программы Dwarf Dumper могут показать это по-другому. В Mac OS X dwarfdump
показывает эту связь с отступом — дети DIE имеют отступ немного больше, чем родительские DIE.
Если вы смотрите на спецификации DWARF на http://dwarfstd.org/ вы ничего не найдете об этом числе в стандарте — но если вы напишите подлинный парсер DWARF (в отличие от парсера, который интерпретирует вывод readelf
или что-то еще), вы увидите эту тему, освещенную в разделе 2.3 («Отношения записей отладочной информации») и в разделе 7.5.3 «Таблицы сокращений» (DW_CHILDREN_yes
или же DW_CHILDREN_no
) в спецификации DWARF4
Других решений пока нет …