aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-11-19 19:15:20 +1030
committerAlan Modra <amodra@gmail.com>2019-11-19 19:26:40 +1030
commit6765ee1825d92d25d9b3f6260de3f8a2a27e4998 (patch)
tree65c95e752439552d1b55a35312eb1724148ae505
parentdd68a12bc4b19c50c31fe357335bb8ee9a3322fc (diff)
downloadgdb-6765ee1825d92d25d9b3f6260de3f8a2a27e4998.zip
gdb-6765ee1825d92d25d9b3f6260de3f8a2a27e4998.tar.gz
gdb-6765ee1825d92d25d9b3f6260de3f8a2a27e4998.tar.bz2
PR24968, make objcopy use output ELF arch if -B not given
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.
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/objcopy.c11
2 files changed, 16 insertions, 2 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 4fabf0c..19f1c40 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,12 @@
2019-11-19 Alan Modra <amodra@gmail.com>
+ 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.
+
+2019-11-19 Alan Modra <amodra@gmail.com>
+
PR 25191
* objcopy.c (is_nondebug_keep_contents_section): Use bfd_get_flavour.
(copy_object): Likewise.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 551378d..99cc7be 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)))