From 999d6dff80fab12d22c2a8d91923db6bde7fb3e5 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 28 Jun 2019 10:18:49 +0930 Subject: [PATCH] Plugin target handling 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 | 11 +++++++++++ bfd/config.bfd | 5 ----- bfd/configure | 15 +++++++-------- bfd/configure.ac | 15 +++++++-------- bfd/format.c | 9 ++++++++- bfd/targets.c | 8 ++++---- 6 files changed, 37 insertions(+), 26 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0e1847e6e7f..04bdb786076 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2019-06-28 Alan Modra + + * 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 PR 24703 diff --git a/bfd/config.bfd b/bfd/config.bfd index c6b04ea4a58..13d678e1f88 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -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*) diff --git a/bfd/configure b/bfd/configure index 6f95045e597..b1a727a54a3 100755 --- a/bfd/configure +++ b/bfd/configure @@ -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" ;; @@ -14983,6 +14978,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. diff --git a/bfd/configure.ac b/bfd/configure.ac index c9413891384..39702ce1315 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -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. diff --git a/bfd/format.c b/bfd/format.c index 97a92291a87..1d1363d1840 100644 --- a/bfd/format.c +++ b/bfd/format.c @@ -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; diff --git a/bfd/targets.c b/bfd/targets.c index d3d52a5e2aa..6b85c627980 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -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 -- 2.30.2