Index: elf32-xtensa.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v retrieving revision 1.99 diff -u -p -r1.99 elf32-xtensa.c --- elf32-xtensa.c 5 Oct 2007 19:05:35 -0000 1.99 +++ elf32-xtensa.c 5 Oct 2007 20:27:19 -0000 @@ -8150,8 +8150,53 @@ relax_section (bfd *abfd, asection *sec, we may need to change the relocation's target offset. */ target_sec = r_reloc_get_section (&r_rel); - target_relax_info = get_xtensa_relax_info (target_sec); + /* For a reference to a discarded section from a DWARF section, + i.e., where action_discarded is PRETEND, the symbol will + eventually be modified to refer to the kept section (at least if + the kept and discarded sections are the same size). Anticipate + that here and adjust things accordingly. */ + if (sec->sec_info_type != ELF_INFO_TYPE_STABS + && ! elf_xtensa_ignore_discarded_relocs (sec) + && elf_xtensa_action_discarded (sec) == PRETEND + && target_sec != NULL + && elf_discarded_section (target_sec)) + { + /* It would be natural to call _bfd_elf_check_kept_section + here, but it's not exported from elflink.c. It's also a + fairly expensive check. Adjusting the relocations to the + discarded section is fairly harmless; it will only adjust + some addends and difference values. If it turns out that + _bfd_elf_check_kept_section fails later, it won't matter, + so just compare the section names to find the right group + member. */ + asection *kept = target_sec->kept_section; + if (kept != NULL) + { + if ((kept->flags & SEC_GROUP) != 0) + { + asection *first = elf_next_in_group (kept); + asection *s = first; + + kept = NULL; + while (s != NULL) + { + if (strcmp (s->name, target_sec->name) == 0) + { + kept = s; + break; + } + s = elf_next_in_group (s); + if (s == first) + break; + } + } + } + if (kept) + target_sec = kept; + } + + target_relax_info = get_xtensa_relax_info (target_sec); if (target_relax_info && (target_relax_info->is_relaxable_literal_section || target_relax_info->is_relaxable_asm_section)) Index: elflink.c =================================================================== RCS file: /cvs/src/src/bfd/elflink.c,v retrieving revision 1.281 diff -u -p -r1.281 elflink.c --- elflink.c 30 Sep 2007 13:43:23 -0000 1.281 +++ elflink.c 5 Oct 2007 20:27:21 -0000 @@ -8787,7 +8787,9 @@ _bfd_elf_check_kept_section (asection *s { if ((kept->flags & SEC_GROUP) != 0) kept = match_group_member (sec, kept, info); - if (kept != NULL && sec->size != kept->size) + /* The kept section may have been relaxed; compare its original size. */ + if (kept != NULL && + sec->size != elf_section_data (kept)->this_hdr.sh_size) kept = NULL; sec->kept_section = kept; }