PR24968, make objcopy use output ELF arch if -B not given

Message ID 20191119085732.GJ13199@bubble.grove.modra.org
State New
Headers show
Series
  • PR24968, make objcopy use output ELF arch if -B not given
Related show

Commit Message

Alan Modra Nov. 19, 2019, 8:57 a.m.
This should make objcopy -B redundant for the common case of producing
ELF output where the -O target defaults to the desired arch:mach.

	PR 24968
	* objcopy.c (copy_object): For ELF output and non-ELF input without
	arch, take arch from output file if not given by -B.  Don't
	bfd_get_arch_info when we already have iarch.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 551378da39..99cc7beca8 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2646,8 +2646,7 @@  copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
   imach = bfd_get_mach (ibfd);
   if (input_arch)
     {
-      if (bfd_get_arch_info (ibfd) == NULL
-	  || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
+      if (iarch == bfd_arch_unknown)
 	{
 	  iarch = input_arch->arch;
 	  imach = input_arch->mach;
@@ -2656,6 +2655,14 @@  copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
 	non_fatal (_("Input file `%s' ignores binary architecture parameter."),
 		   bfd_get_archive_filename (ibfd));
     }
+  if (iarch == bfd_arch_unknown
+      && bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+      && bfd_get_flavour (obfd) == bfd_target_elf_flavour)
+    {
+      const struct elf_backend_data *bed = get_elf_backend_data (obfd);
+      iarch = bed->arch;
+      imach = 0;
+    }
   if (!bfd_set_arch_mach (obfd, iarch, imach)
       && (ibfd->target_defaulted
 	  || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))