Plugin target handling
authorAlan Modra <amodra@gmail.com>
Fri, 28 Jun 2019 00:48:49 +0000 (10:18 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 28 Jun 2019 00:48:49 +0000 (10:18 +0930)
This patch fixes failures with LTO on mingw32 targets.  Since git
commit 7cf7fcc83c all possible targets (minus binary) are matched in
bfd_check_format_matches rather than lower priority targets being
excluded once a higher priority target matches.  During linking that
results in the ld/plugin.c plugin_object_p function being called with
the input file xvec set to plugin_vec, which means
plugin_get_ir_dummy_bfd doesn't see the real format of the file
(pe-i386).  It defaults to the output format instead, which happens to
be pei-i386, and this wrong choice persists for the dummy bfd.
pei-i386 isn't recognised as a valid linker input file.

So, omit recognizing a plugin object in bfd_check_format_matches when
some other object format matches, and make sure those other object
formats are checked first.

* format.c (bfd_check_format_matches): Don't match plugin target
if another target matches.  Expand comment.
* targets.c (_bfd_target_vector): Move plugin_vec after all other
non-corefile targets, outside !SELECT_VECS.
* config.bfd: Don't handle targ=plugin here.
* configure.ac: Don't add plugin to enable_targets or handle in
target loop setting selvecs and other target vars.
* configure: Regenerate.

bfd/ChangeLog
bfd/config.bfd
bfd/configure
bfd/configure.ac
bfd/format.c
bfd/targets.c

index 0e1847e6e7ff0d400700b1aff062fb66057dbf82..04bdb78607676cebf37e78dd26a1b9447e27dd63 100644 (file)
@@ -1,3 +1,14 @@
+2019-06-28  Alan Modra  <amodra@gmail.com>
+
+       * format.c (bfd_check_format_matches): Don't match plugin target
+       if another target matches.  Expand comment.
+       * targets.c (_bfd_target_vector): Move plugin_vec after all other
+       non-corefile targets, outside !SELECT_VECS.
+       * config.bfd: Don't handle targ=plugin here.
+       * configure.ac: Don't add plugin to enable_targets or handle in
+       target loop setting selvecs and other target vars.
+       * configure: Regenerate.
+
 2019-06-26  Nick Clifton  <nickc@redhat.com>
 
        PR 24703
index c6b04ea4a58a7c1938a7baf399a83e96fffb26e5..13d678e1f88f41c3debc24d97143a2d196051b9a 100644 (file)
@@ -218,11 +218,6 @@ esac
 #  convention, else the table becomes a real mess to understand and maintain.
 
 case "${targ}" in
-  plugin)
-    targ_defvec=plugin_vec
-    targ_selvecs="plugin_vec"
-    ;;
-
 # START OF targmatch.h
 #ifdef BFD64
   aarch64-*-darwin*)
index 6f95045e597b3d4a16a7385fa3c379018a3f8329..b1a727a54a3e761b22b023d47137a959009b22c6 100755 (executable)
@@ -12409,10 +12409,6 @@ else
 fi
 
 
-if test "$plugins" = "yes"; then
-  enable_targets="$enable_targets plugin"
-fi
-
 # Check whether --enable-64-bit-bfd was given.
 if test "${enable_64_bit_bfd+set}" = set; then :
   enableval=$enable_64_bit_bfd; case "${enableval}" in
@@ -14613,12 +14609,12 @@ selarchs=
 TDEFINES=
 for targ in $target $canon_targets
 do
-    if test "x$targ" = "xall"; then
+    if test $targ = all; then
         all_targets=true
        assocvecs="$assocvecs $targ_defvec $targ_selvecs"
-    else
+    elif test $targ != plugin; then
        . $srcdir/config.bfd
-       if test "x$targ" = "x$target"; then
+       if test $targ = $target; then
            defvec=$targ_defvec
        fi
        selvecs="$selvecs $targ_defvec $targ_selvecs"
@@ -14856,7 +14852,6 @@ do
     pef_xlib_vec)               tb="$tb pef.lo" ;;
     pj_elf32_vec)               tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     pj_elf32_le_vec)            tb="$tb elf32-pj.lo elf32.lo $elf" ;;
-    plugin_vec)                         tb="$tb plugin.lo" ;;
     powerpc_boot_vec)           tb="$tb ppcboot.lo" ;;
     powerpc_elf32_vec)          tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
     powerpc_elf32_le_vec)       tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
     fi
 done
 
+if test "$plugins" = "yes"; then
+     tb="$tb plugin.lo"
+fi
+
 # Target architecture .o files.
 # A couple of CPUs use shorter file names to avoid problems on DOS
 # filesystems.
index c94138913843c7979d06c0284c2e85da50886f50..39702ce1315ef0f7a2d699cf100b3b49914ca5e4 100644 (file)
@@ -46,10 +46,6 @@ ACX_LARGEFILE
 
 AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes")
 
-if test "$plugins" = "yes"; then
-  enable_targets="$enable_targets plugin"
-fi
-
 AC_ARG_ENABLE(64-bit-bfd,
 [  --enable-64-bit-bfd     64-bit support (on hosts with narrower word sizes)],
 [case "${enableval}" in
@@ -349,12 +345,12 @@ selarchs=
 TDEFINES=
 for targ in $target $canon_targets
 do
-    if test "x$targ" = "xall"; then
+    if test $targ = all; then
         all_targets=true
        assocvecs="$assocvecs $targ_defvec $targ_selvecs"
-    else
+    elif test $targ != plugin; then
        . $srcdir/config.bfd
-       if test "x$targ" = "x$target"; then
+       if test $targ = $target; then
            defvec=$targ_defvec
        fi
        selvecs="$selvecs $targ_defvec $targ_selvecs"
@@ -592,7 +588,6 @@ do
     pef_xlib_vec)               tb="$tb pef.lo" ;;
     pj_elf32_vec)               tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     pj_elf32_le_vec)            tb="$tb elf32-pj.lo elf32.lo $elf" ;;
-    plugin_vec)                         tb="$tb plugin.lo" ;;
     powerpc_boot_vec)           tb="$tb ppcboot.lo" ;;
     powerpc_elf32_vec)          tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
     powerpc_elf32_le_vec)       tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
@@ -719,6 +714,10 @@ do
     fi
 done
 
+if test "$plugins" = "yes"; then
+     tb="$tb plugin.lo"
+fi
+
 # Target architecture .o files.
 # A couple of CPUs use shorter file names to avoid problems on DOS
 # filesystems.
index 97a92291a8794f0b86646e7ddfbd02b61de6a939..1d1363d18403cef706ec1a81f164c5b6521dd20f 100644 (file)
@@ -290,8 +290,15 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
     {
       const bfd_target *temp;
 
-      /* Don't check the default target twice.  */
+      /* The binary target matches anything, so don't return it when
+        searching.  Don't match the plugin target if we have another
+        alternative since we want to properly set the input format
+        before allowing a plugin to claim the file.  Also, don't
+        check the default target twice.  */
       if (*target == &binary_vec
+#if BFD_SUPPORTS_PLUGINS
+         || (match_count != 0 && *target == &plugin_vec)
+#endif
          || (!abfd->target_defaulted && *target == save_targ))
        continue;
 
index d3d52a5e2aa078c1611f4af8cdf0ccd531c03c12..6b85c6279805290507fe6dca9dd465d02afaa019 100644 (file)
@@ -1149,10 +1149,6 @@ static const bfd_target * const _bfd_target_vector[] =
        &pj_elf32_vec,
        &pj_elf32_le_vec,
 
-#if BFD_SUPPORTS_PLUGINS
-       &plugin_vec,
-#endif
-
        &powerpc_boot_vec,
        &powerpc_elf32_vec,
        &powerpc_elf32_le_vec,
@@ -1305,6 +1301,10 @@ static const bfd_target * const _bfd_target_vector[] =
 /* Likewise for ihex.  */
        &ihex_vec,
 
+#if BFD_SUPPORTS_PLUGINS
+       &plugin_vec,
+#endif
+
 /* Add any required traditional-core-file-handler.  */
 
 #ifdef AIX386_CORE