PATCH: PR 233: Check non-debug local references to discarded sections
H. J. Lu
hjl@lucon.org
Tue Jun 29 16:13:00 GMT 2004
This bug
http://sources.redhat.com/bugzilla/show_bug.cgi?id=233
is actually a gcc bug. But the linker failed to issue an error for
non-debug local references to discarded sections. This patch fixes
the linker.
H.J.
-------------- next part --------------
bfd/
2004-06-29 H.J. Lu <hongjiu.lu@intel.com>
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 <hongjiu.lu@intel.com>
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
More information about the Binutils
mailing list