2017-01-12 2 views
3

Например:Что означает самое левое число в дампе DWARF от readelf?

<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <c> DW_AT_producer : (indirect string, offset: 0xe): GNU C1 
1 5.4.0 20160609 -masm=intel -m32 -mtune=generic -march=i686 -g -fst 
ack-protector-strong 
    <10> DW_AT_language : 12  (ANSI C99) 
    <11> DW_AT_name  : (indirect string, offset: 0xbe): hell 
o.c 
    <15> DW_AT_comp_dir : (indirect string, offset: 0x97): /tmp 
    <19> DW_AT_low_pc  : 0x804840b 
    <1d> DW_AT_high_pc  : 0x2e 
    <21> DW_AT_stmt_list : 0x0 
<1><25>: Abbrev Number: 2 (DW_TAG_base_type) 
    <26> DW_AT_byte_size : 4 
    <27> DW_AT_encoding : 7  (unsigned) 
    <28> DW_AT_name  : (indirect string, offset: 0x77): unsi 
gned int 
<1><2c>: Abbrev Number: 2 (DW_TAG_base_type) 
    <2d> DW_AT_byte_size : 1 
    <2e> DW_AT_encoding : 8  (unsigned char) 
    <2f> DW_AT_name  : (indirect string, offset: 0x84): unsi 
gned char 
<1><33>: Abbrev Number: 2 (DW_TAG_base_type) 
    <34> DW_AT_byte_size : 2 
    <35> DW_AT_encoding : 7  (unsigned) 
    <36> DW_AT_name  : (indirect string, offset: 0xa1): shor 
t unsigned int 

В начале каждой записи DIE, существует ряд таких как <0>, <1> ... что делать это число означает? Кажется, что то же самое число указывает на тот же тип DWARF, я думаю, например. записи с <1> означают, что все они (DW_TAG_base_type).

ответ

5

DWARF DIEs расположены в дереве. Самое левое число указывает глубину DIE. В вашем примере:

<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) 

<0> означает, что это DIE появляется на внешнем уровне. Это произойдет только для компиляции или типа единиц измерения DIE.

Тогда:

<1><25>: Abbrev Number: 2 (DW_TAG_base_type) 

Это DIE является потомком блока компиляции DIE.

Вы можете получить более глубокое гнездование; например, локальные переменные функции могут быть довольно глубоко вложенными, в зависимости от структуры блока функции. Элементы в пространстве имен также могут быть вложенными.

Смежные вопросы