]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
strip: Don't check target_defaulted in input BFD
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 30 Jul 2025 15:53:11 +0000 (08:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 31 Jul 2025 00:45:38 +0000 (17:45 -0700)
The target_defaulted field in BFD is set to true if the target isn't
specified.  After

commit 717a38e9a02109fcbcb18bb2ec3aa251e2ad0a0d
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sun May 4 05:12:46 2025 +0800

    strip: Add GCC LTO IR support

the target is set to "plugin" if BFD supports plugin when the target
isn't specified nor default.  Update strip to check the input target,
instead of the target_defaulted field in input BFD.

PR binutils/33230
* objcopy.c (copy_object): Add a bool argument, target_defaulted,
to indicate if the input target isn't specified nor default.
Check it instead of ibfd->target_defaulted.
(copy_archive): Add a bool argument, target_defaulted, and pass
it to copy_object.
(copy_file): Set target_defaulted to true if the input target
isn't specified and pass it to copy_archive and copy_object.
* testsuite/binutils-all/x86-64/pr33230.obj.bz2: New file.
* testsuite/binutils-all/x86-64/x86-64.exp: Run PR binutils/33230
tests.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
binutils/objcopy.c
binutils/testsuite/binutils-all/x86-64/pr33230.obj.bz2 [new file with mode: 0644]
binutils/testsuite/binutils-all/x86-64/x86-64.exp

index 905ce917708017c79e6f5fb949f582549ca6e01e..e90117af90b26882fdc7f85b499df645827412bd 100644 (file)
@@ -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 (file)
index 0000000..6309a2a
Binary files /dev/null and b/binutils/testsuite/binutils-all/x86-64/pr33230.obj.bz2 differ
index ab1aa50a9a19c27e23d89f06d295a35f5a251f75..a3fe6b13a7c91a2115051f7b5b893a9b03e6ad78 100644 (file)
@@ -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)"
+    }
+}