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