2017-01-12 8 views
3

:各DIEエントリの開始時に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 

、このよう<0><1>として番号がある...これらの数は、何を意味していますか?同じ数字が同じDWARFタイプを示しているようです。 <1>というエントリは、すべてが(DW_TAG_base_type)であることを意味します。

答えて

5

DWARF DIEはツリー内に配置されています。一番左の数値はDIEの深さを示します。あなたの例では:

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

<0>は、このダイは、最も外側のレベルで表示されていることを意味します。これは、コンパイル単位または型単位のDIEに対してのみ発生します。その後

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

このDIEは、コンパイル単位のDIEの子です。

より深いネスティングを得ることができます。たとえば、関数のブロック構造によっては、関数のローカル変数がかなり深く入れ子になっている可能性があります。ネームスペース内の項目もネストされる可能性があります。

関連する問題