*** ../binutils-2.24.orig/bfd/dwarf2.c 2014-01-28 11:58:02.072737296 +0000 --- bfd/dwarf2.c 2014-01-28 11:59:38.575739971 +0000 *************** find_abstract_instance_name (struct comp *** 2126,2131 **** --- 2126,2153 ---- abort (); info_ptr = unit->sec_info_ptr + die_ref; + + /* Now find the CU containing this pointer. */ + if (info_ptr >= unit->info_ptr_unit && info_ptr < unit->end_ptr) + ; + else + { + /* Check other CUs to see if they contain the abbrev. */ + struct comp_unit * u; + + for (u = unit->prev_unit; u != NULL; u = u->prev_unit) + if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr) + break; + + if (u == NULL) + for (u = unit->next_unit; u != NULL; u = u->next_unit) + if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr) + break; + + if (u) + unit = u; + /* else FIXME: What do we do now ? */ + } } else if (attr_ptr->form == DW_FORM_GNU_ref_alt) { *************** find_abstract_instance_name (struct comp *** 2137,2142 **** --- 2159,2166 ---- bfd_set_error (bfd_error_bad_value); return name; } + /* FIXME: Do we need to locate the correct CU, in a similar + fashion to the code in the DW_FORM_ref_addr case above ? */ } else info_ptr = unit->info_ptr_unit + die_ref;