Interpretation of DW_AT_external

Sami Wagiaalla swagiaal@redhat.com
Mon Aug 25 14:57:00 GMT 2008


the following program:

namespace A{
   int a;
}

int main(){
   A::a;
   return 0;
}

compiled with gcc 4.3.0-8 produces the following debug info for int a:

[...]
  <2><5d>: Abbrev Number: 5 (DW_TAG_variable)
     <5e>   DW_AT_name        : a
     <60>   DW_AT_decl_file   : 1
     <61>   DW_AT_decl_line   : 5
     <62>   DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2e):
_ZN1A1aE
     <66>   DW_AT_type        : <0x4d>
     <6a>   DW_AT_external    : 1
     <6b>   DW_AT_declaration : 1
[...]

The following snippet of gdb code interprets DW_AT_external as 'a' must 
be global which is not correct in this situation. 'a' should not be 
found in the global scope. But more importantly, which is what I am 
working on right now, a should be found the the scope of the namespace A.

from dwarf2read.c:

       attr2 = dwarf2_attr (die, DW_AT_external, cu);
       if (attr2 && (DW_UNSND (attr2) != 0))
	add_symbol_to_list (sym, &global_symbols);
       else
	add_symbol_to_list (sym, cu->list_in_scope);
       break;


I assume gcc is saying that A::a is visible globally and not a. Is this 
a bad tag or a misinterpretation by gdb ?

Sami



More information about the Archer mailing list