我试图使用 dwarf 来比较两个 c++ 文件,但是当我在非成员函数中获取局部变量时遇到了问题。考虑以下代码 -
int f(){
[static] int j=0;
return j;
}
如果我在没有修饰符的情况下编译它,static
我会得到以下侏儒信息 -
<1><eb>: Abbrev Number: 13 (DW_TAG_subprogram)
<ec> DW_AT_external : 1
<ed> DW_AT_name : f
<ef> DW_AT_decl_file : 1
<f0> DW_AT_decl_line : 15
<f1> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x22): _Z1fv
<f5> DW_AT_type : <0xa8>
<f9> DW_AT_low_pc : 0x0
<101> DW_AT_high_pc : 0x10
<109> DW_AT_frame_base : 0x0 (location list)
<10d> DW_AT_sibling : <0x130>
<2><111>: Abbrev Number: 14 (DW_TAG_lexical_block)
<112> DW_AT_low_pc : 0x4
<11a> DW_AT_high_pc : 0xe
<3><122>: Abbrev Number: 15 (DW_TAG_variable)
<123> DW_AT_name : j
<125> DW_AT_decl_file : 1
<126> DW_AT_decl_line : 16
<127> DW_AT_type : <0xa8>
<12b> DW_AT_location : 2 byte block: 91 6c (DW_OP_fbreg: -20)
但是如果我用static
修饰符编译它,我会得到-
<1><eb>: Abbrev Number: 13 (DW_TAG_subprogram)
<ec> DW_AT_external : 1
<ed> DW_AT_name : f
<ef> DW_AT_decl_file : 1
<f0> DW_AT_decl_line : 22
<f1> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x24): _Z1fv
<f5> DW_AT_type : <0xa8>
<f9> DW_AT_low_pc : 0x0
<101> DW_AT_high_pc : 0xc
<109> DW_AT_frame_base : 0x0 (location list)
<10d> DW_AT_sibling : <0x137>
<2><111>: Abbrev Number: 14 (DW_TAG_lexical_block)
<112> DW_AT_low_pc : 0x4
<11a> DW_AT_high_pc : 0xa
<3><122>: Abbrev Number: 15 (DW_TAG_variable)
<123> DW_AT_name : j
<125> DW_AT_decl_file : 1
<126> DW_AT_decl_line : 23
<127> DW_AT_type : <0xa8>
<12b> DW_AT_location : 9 byte block: 3 20 0 0 0 0 0 0 0 (DW_OP_addr: 20)
现在据我所知,这些文件之间只有一个真正的区别——DW_AT_location
变量 j 的属性上的字节块大小不同(这就是为什么DW_AT_sibling
函数 f 的标签中的属性不同,所以我不算)。我认为这在某种程度上意味着静态,但我不知道如何。