0

次のドワーフ コードのサンプルを考えてみましょう -

<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)

私は dwarf ファイルを解析するプログラムに取り組んでいますが、その一部について確信が持てません。お気付きのように、各タグの左側に追加の番号があります (このサンプルでは、​​<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;
4

1 に答える 1

2

DWARF DIE はツリーとして編成されます。1DW_TAG_compile_unitつのファイルのトップ レベルには、すべての型定義 (DW_TAG_class_type例)、すべての関数 ( DW_TAG_subprogram)、およびグローバル/静的変数 ( DW_TAG_variable) が含まれます。クラス定義 ( ) は親 DIE になり、メンバー変数やメソッドなどのDW_TAG_class_type子を含みます。DW_TAG_memberDW_TAG_subprogram

追加した出力は、特定の DWARF ダンパーの動作方法です。その番号を使用して親子関係を示しているようです。これreadelfですか?他のドワーフ ダンパー プログラムは、これを別の方法で表示することを選択する場合があります。Mac OS X では、dwarfdumpこのインデントとの関係を示しています。子の DIE は、親の DIE よりも少しだけインデントされています。

http://dwarfstd.org/の DWARF 仕様を見ている場合、標準ではこの数値について何も見つかりませんが、本物の DWARF パーサーを作成すると (readelfこのトピックは、DWARF4 仕様のセクション 2.3 (「デバッグ情報エントリの関係」) およびセクション 7.5.3 「略語表」 (または) で説明されていますDW_CHILDREN_yesDW_CHILDREN_no

于 2013-06-06T07:14:09.143 に答える