This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix -flto on mingw (PR ld/18199)


As noted in PR65581 on the GCC bug tracker, on i686-mingw32, compiling a program in GCC with -flto results in this type of failure:

$ gcc gcc/testsuite/gcc.c-torture/execute/20000113-1.c -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -flto -flto-partition=none -w -DNO_TRAMPOLINES -lm -o ./20000113-1.exe
/tmp/ccSMtMEn.lto.o:<artificial>:(.text.startup+0x0): multiple definition of `main'
/opt/codesourcery/bin/../lib/gcc/i686-mingw32/5.2.0/../../../../i686-mingw32/lib/libmingw32.a(main.o):main.c:(.text.startup+0x0): first defined here /opt/codesourcery/bin/../lib/gcc/i686-mingw32/5.2.0/../../../../i686-mingw32/lib/libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2: error: ld returned 1 exit status

By bisection, I found that the issue started with commit 5ae0078cd2b6b69e6119864e20987c8724916b29 (Merge linker plugin handling into BFD plugin support). The problem seems to be this change:

@@ -295,14 +298,19 @@ plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)

   bfd_use_reserved_id = 1;
   abfd = bfd_create (concat (name, IRONLY_SUFFIX, (const char *) NULL),
-		     srctemplate);
+		     link_info.output_bfd);
   if (abfd != NULL)
     {
       abfd->flags |= BFD_LINKER_CREATED | BFD_PLUGIN;
-      bfd_set_arch_info (abfd, bfd_get_arch_info (srctemplate));
-      bfd_set_gp_size (abfd, bfd_get_gp_size (srctemplate));
-      if (bfd_make_writable (abfd)
-	  && bfd_copy_private_bfd_data (srctemplate, abfd))
+      if (!bfd_make_writable (abfd))
+	goto report_error;
+      if (! bfd_plugin_target_p (srctemplate->xvec))
+	{
+	  bfd_set_arch_info (abfd, bfd_get_arch_info (srctemplate));
+	  bfd_set_gp_size (abfd, bfd_get_gp_size (srctemplate));
+	  if (!bfd_copy_private_bfd_data (srctemplate, abfd))
+	    goto report_error;
+	}
 	{
 	  flagword flags;

I believe the intent of this change is for things to proceed as they were before patching if bfd_plugin_target_p (srctemplate->xvec) returns false? However, since abfd was created using link_info.output_bfd as a template, abfd->xvec is set to link_info.output_bfd->xvec rather than srctemplate->xvec as before. On most targets, the input and output file formats will be the same so this does not really matter, but on Windows these can be different (i386_pe_vec/x86_64_pe_vec versus i386_pei_vec/x86_64_pei_vec), and that seems to be causing the problem here. If abfd->xvec is set to srctemplate->xvec when bfd_plugin_target_p returns false, the -flto problem no longer appears.

Okay to commit on trunk?

Kwok Cheung Yeung

2015-12-10  Kwok Cheung Yeung  <kcy@codesourcery.com>

	PR ld/18199
	* plugin.c (plugin_get_ir_dummy_bfd): Set target vector from
	srctemplate if it is not the BFD plugin target vector.

diff --git a/ld/plugin.c b/ld/plugin.c
index 8e53255..1f1b2b1 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -306,6 +306,7 @@ plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)
        goto report_error;
       if (! bfd_plugin_target_p (srctemplate->xvec))
        {
+         abfd->xvec = srctemplate->xvec;
          bfd_set_arch_info (abfd, bfd_get_arch_info (srctemplate));
          bfd_set_gp_size (abfd, bfd_get_gp_size (srctemplate));
          if (!bfd_copy_private_bfd_data (srctemplate, abfd))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]