The GNU 4.1.2 C++ compiler is mangling typedef names to the point that they are not retrievable from the DWARF data.
For example, the type BASE_UNION is defined as typedef union { char ch; int iVal; long IVal; } BASE_UNION; The GNU 4.1.2 compiler generates the following DWARF data for this type <1><1279>: Abbrev Number: 35 (DW_TAG_union_type) <127a> DW_AT_sibling : <12a8> <127e> DW_AT_name : $_4 <1282> DW_AT_byte_size : 4 <1283> DW_AT_decl_file : 35 <1284> DW_AT_decl_line : 29 <2><1285>: Abbrev Number: 36 (DW_TAG_member) <1286> DW_AT_name : ch <1289> DW_AT_decl_file : 35 <128a> DW_AT_decl_line : 30 <128b> DW_AT_type : <c0d> <2><128f>: Abbrev Number: 36 (DW_TAG_member) <1290> DW_AT_name : iVal <1295> DW_AT_decl_file : 35 <1296> DW_AT_decl_line : 31 <1297> DW_AT_type : <b7f> <2><129b>: Abbrev Number: 36 (DW_TAG_member) <129c> DW_AT_name : IVal <12a1> DW_AT_decl_file : 35 <12a2> DW_AT_decl_line : 32 <12a3> DW_AT_type : <b86> Notice that the union name has been changed to "$_4" in DIE <1279>. The GNU 3.4.4 compiler generates the following DWARF data from the same source code: <1><11d0>: Abbrev Number: 27 (DW_TAG_union_type) DW_AT_sibling : <123f> DW_AT_name : (indirect string, offset: 0x6e): BASE_UNION DW_AT_byte_size : 4 DW_AT_decl_file : 3 DW_AT_decl_line : 29 <2><11dc>: Abbrev Number: 28 (DW_TAG_member) DW_AT_name : ch DW_AT_decl_file : 3 DW_AT_decl_line : 30 DW_AT_type : <e6d> <2><11e6>: Abbrev Number: 28 (DW_TAG_member) DW_AT_name : iVal DW_AT_decl_file : 3 DW_AT_decl_line : 31 DW_AT_type : <ddf> <2><11f2>: Abbrev Number: 28 (DW_TAG_member) DW_AT_name : IVal DW_AT_decl_file : 3 DW_AT_decl_line : 32 DW_AT_type : <de6> <2><11fe>: Abbrev Number: 29 (DW_TAG_subprogram) DW_AT_sibling : <1219> DW_AT_name : (indirect string, offset: 0x79): operator= DW_AT_type : <123f> DW_AT_artificial : 1 DW_AT_declaration : 1 <3><120d>: Abbrev Number: 9 (DW_TAG_formal_parameter) DW_AT_type : <1245> DW_AT_artificial : 1 <3><1213>: Abbrev Number: 10 (DW_TAG_formal_parameter) DW_AT_type : <124b> <2><1219>: Abbrev Number: 30 (DW_TAG_subprogram) DW_AT_sibling : <1230> DW_AT_name : $_4 DW_AT_artificial : 1 DW_AT_declaration : 1 <3><1224>: Abbrev Number: 9 (DW_TAG_formal_parameter) DW_AT_type : <1245> DW_AT_artificial : 1 <3><122a>: Abbrev Number: 10 (DW_TAG_formal_parameter) DW_AT_type : <124b> <2><1230>: Abbrev Number: 31 (DW_TAG_subprogram) DW_AT_name : $_4 DW_AT_artificial : 1 DW_AT_declaration : 1 <3><1237>: Abbrev Number: 9 (DW_TAG_formal_parameter) DW_AT_type : <1245> DW_AT_artificial : 1 Notice that DIE <11D0> contains the correct type name. Also notice that coincidently, DIE <1230> has a constructor with the "$_4" name which was used as the type name in GNU 4.1.2. Why is GNU 4.1.2 generating the mangled type name and how do I correct this to generate the real type name?