bfd/ 2004-06-29 H.J. Lu PR 233 * elflink.c (elf_section_ignore_discarded_relocs): Return TRUE for .eh_frame sections. (elf_link_input_bfd): Issue an error for non-debug local references to discarded sections and report their locations. ld/testsuite/ 2004-06-29 H.J. Lu PR 233 * ld-discard/extern.d: Updated. * ld-discard/start.d: Likewise. * ld-discard/static.d: Likewise. --- binutils/bfd/elflink.c.linkonce 2004-06-29 00:28:17.000000000 -0700 +++ binutils/bfd/elflink.c 2004-06-29 08:54:28.005163912 -0700 @@ -6277,6 +6277,10 @@ elf_section_ignore_discarded_relocs (ase && (*bed->elf_backend_ignore_discarded_relocs) (sec)) return TRUE; + /* Catch all .eh_frame sections. */ + if (strcmp (sec->name, ".eh_frame") == 0) + return TRUE; + return FALSE; } @@ -6582,8 +6586,7 @@ elf_link_input_bfd (struct elf_final_lin { BFD_ASSERT (r_symndx != 0); /* Try to preserve debug information. */ - if ((o->flags & SEC_DEBUGGING) != 0 - && sec->kept_section != NULL + if (sec->kept_section != NULL && sec->size == sec->kept_section->size) h->root.u.def.section = sec->kept_section; @@ -6593,9 +6596,11 @@ elf_link_input_bfd (struct elf_final_lin else finfo->info->callbacks->error_handler (LD_DEFINITION_IN_DISCARDED_SECTION, - _("%T: discarded in section `%s' from %s\n"), + _("`%T' referenced in section `%s' from %s: discarded in section `%s' from %s\n"), h->root.root.string, h->root.root.string, + o->name, + bfd_archive_filename (o->owner), h->root.u.def.section->name, bfd_archive_filename (h->root.u.def.section->owner)); } @@ -6606,13 +6611,11 @@ elf_link_input_bfd (struct elf_final_lin if (sec != NULL && elf_discarded_section (sec)) { - if ((o->flags & SEC_DEBUGGING) != 0 - || (sec->flags & SEC_LINK_ONCE) != 0) + if ((o->flags & SEC_DEBUGGING) != 0) { BFD_ASSERT (r_symndx != 0); /* Try to preserve debug information. */ - if ((o->flags & SEC_DEBUGGING) != 0 - && sec->kept_section != NULL + if (sec->kept_section != NULL && sec->size == sec->kept_section->size) finfo->sections[r_symndx] = sec->kept_section; @@ -6634,8 +6637,8 @@ elf_link_input_bfd (struct elf_final_lin buf = (char *) "local symbol"; finfo->info->callbacks->error_handler (LD_DEFINITION_IN_DISCARDED_SECTION, - _("%T: discarded in section `%s' from %s\n"), - buf, buf, sec->name, + _("`%T' referenced in section `%s': discarded in section `%s' from %s\n"), + buf, buf, o->name, sec->name, bfd_archive_filename (input_bfd)); if (ok != -1) free (buf); --- binutils/ld/testsuite/ld-discard/extern.d.linkonce 2003-06-04 10:28:29.000000000 -0700 +++ binutils/ld/testsuite/ld-discard/extern.d 2004-06-29 08:58:27.634169896 -0700 @@ -1,3 +1,3 @@ #source: extern.s #ld: -T discard.ld -#error: data: discarded in section `\.data\.exit' from tmpdir/dump0.o +#error: `data' referenced in section `\.text' from tmpdir/dump0.o: discarded in section `\.data\.exit' from tmpdir/dump0.o --- binutils/ld/testsuite/ld-discard/start.d.linkonce 2003-06-04 10:28:29.000000000 -0700 +++ binutils/ld/testsuite/ld-discard/start.d 2004-06-29 08:58:32.544534645 -0700 @@ -1,4 +1,4 @@ #source: start.s #source: exit.s #ld: -T discard.ld -#error: data: discarded in section `\.data\.exit' from tmpdir/dump1.o +#error: `data' referenced in section `\.text' from tmpdir/dump0.o: discarded in section `\.data\.exit' from tmpdir/dump1.o --- binutils/ld/testsuite/ld-discard/static.d.linkonce 2003-06-04 10:28:29.000000000 -0700 +++ binutils/ld/testsuite/ld-discard/static.d 2004-06-29 08:58:37.727864076 -0700 @@ -1,3 +1,3 @@ #source: static.s #ld: -T discard.ld -#error: local symbol 0: discarded in section `\.data\.exit' from tmpdir/dump0.o +#error: `local symbol 0' referenced in section `\.text': discarded in section `\.data\.exit' from tmpdir/dump0.o