diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 905ce917708..e90117af90b 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -2661,7 +2661,8 @@ set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_h Returns TRUE upon success, FALSE otherwise. */ static bool -copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) +copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch, + bool target_defaulted) { bfd_vma start; long symcount; @@ -2812,7 +2813,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) imach = 0; } if (!bfd_set_arch_mach (obfd, iarch, imach) - && (ibfd->target_defaulted + && (target_defaulted || bfd_get_arch (ibfd) != bfd_get_arch (obfd))) { if (bfd_get_arch (ibfd) == bfd_arch_unknown) @@ -3615,7 +3616,8 @@ fail: static bool copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, bool force_output_target, - const bfd_arch_info_type *input_arch) + const bfd_arch_info_type *input_arch, + bool target_defaulted) { struct name_list { @@ -3772,7 +3774,8 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, #endif if (ok_object) { - ok = copy_object (this_element, output_element, input_arch); + ok = copy_object (this_element, output_element, input_arch, + target_defaulted); if (!ok && bfd_get_arch (this_element) == bfd_arch_unknown) /* Try again as an unknown object file. */ @@ -3872,6 +3875,8 @@ copy_file (const char *input_filename, const char *output_filename, int ofd, char **core_matching; off_t size = get_file_size (input_filename); const char *target = input_target; + bool target_defaulted = (!input_target + || strcmp (input_target, "default") == 0); if (size < 1) { @@ -3979,7 +3984,7 @@ copy_file (const char *input_filename, const char *output_filename, int ofd, } if (!copy_archive (ibfd, obfd, output_target, force_output_target, - input_arch)) + input_arch, target_defaulted)) status = 1; } else if ( @@ -4034,7 +4039,7 @@ copy_file (const char *input_filename, const char *output_filename, int ofd, else #endif { - if (! copy_object (ibfd, obfd, input_arch)) + if (! copy_object (ibfd, obfd, input_arch, target_defaulted)) status = 1; /* PR 17512: file: 0f15796a. diff --git a/binutils/testsuite/binutils-all/x86-64/pr33230.obj.bz2 b/binutils/testsuite/binutils-all/x86-64/pr33230.obj.bz2 new file mode 100644 index 00000000000..6309a2ad810 Binary files /dev/null and b/binutils/testsuite/binutils-all/x86-64/pr33230.obj.bz2 differ diff --git a/binutils/testsuite/binutils-all/x86-64/x86-64.exp b/binutils/testsuite/binutils-all/x86-64/x86-64.exp index ab1aa50a9a1..a3fe6b13a7c 100644 --- a/binutils/testsuite/binutils-all/x86-64/x86-64.exp +++ b/binutils/testsuite/binutils-all/x86-64/x86-64.exp @@ -254,3 +254,36 @@ run_pr33198_test "" "-R .gnu.lto_* -R .gnu.debuglto_* -R .llvm.lto -N __gnu_lto_ run_pr33198_test "-fat" "-R .gnu.lto_* -R .gnu.debuglto_* -R .llvm.lto -N __gnu_lto_v1" run_pr33198_test "" "-R .llvm.lto" run_pr33198_test "-fat" "-R .llvm.lto" + +set t $srcdir/$subdir/pr33230.obj.bz2 +# We need to strip the ".bz2", but can leave the dirname. +set test $subdir/[file tail $t] +set testname [file rootname $test] +verbose $testname +set obj tmpdir/pr33230.o +if {[catch "system \"bzip2 -dc $t > $obj\""] != 0} { + untested "bzip2 -dc ($testname)" +} else { + set cmd "$STRIP $obj -o ${obj}.strip" + send_log "$cmd\n" + verbose "$cmd" 1 + catch "exec $cmd" got + if [regexp "Unable to recognise the format" $got] then { + pass "$testname" + } else { + send_log "$got\n" + verbose "$got" 1 + fail "$testname" + } + set cmd "$STRIP --input-target=default $obj -o ${obj}.strip" + send_log "$cmd\n" + verbose "$cmd" 1 + catch "exec $cmd" got + if [regexp "Unable to recognise the format" $got] then { + pass "$testname" + } else { + send_log "$got\n" + verbose "$got" 1 + fail "$testname (--input-target=default)" + } +}