strip: Don't check target_defaulted in input BFD

The target_defaulted field in BFD is set to true if the target isn't
specified.  After

commit 717a38e9a0
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>
This commit is contained in:
H.J. Lu
2025-07-30 08:53:11 -07:00
parent 9af083a959
commit 8e885fece1
3 changed files with 44 additions and 6 deletions

View 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.

Binary file not shown.

View 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)"
}
}