Fix: GNU-ld: ARM: Issues when trying to set target output architecture
authorNick Clifton <nickc@redhat.com>
Mon, 16 Oct 2023 15:11:49 +0000 (16:11 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 16 Oct 2023 15:11:49 +0000 (16:11 +0100)
  PR 28910
  * elf32-arm.c (elf32_arm_merge_private_bfd_data): Do not set output flags if the input flags have not been set.

bfd/ChangeLog
bfd/elf32-arm.c

index 2731d85db5c2a13fe98603547b38574ab4c77090..1b9d13add2586c808282cb01aef12829f3af466c 100644 (file)
@@ -1,3 +1,9 @@
+2023-10-16  Nick Clifton  <nickc@redhat.com>
+
+       PR 28910
+       * elf32-arm.c (elf32_arm_merge_private_bfd_data): Do not set
+       output flags if the input flags have not been set.
+
 2023-10-09  Nick Clifton  <nickc@redhat.com>
 
        PR 30950
index 18c30dbef866c6804b2b7b9c623e43d64df40724..2e5084978e2c08c34516a39ccf33b9a0aa6083a4 100644 (file)
@@ -20672,16 +20672,17 @@ elf32_arm_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 
   if (!elf_flags_init (obfd))
     {
-      /* If the input is the default architecture and had the default
-        flags then do not bother setting the flags for the output
-        architecture, instead allow future merges to do this.  If no
-        future merges ever set these flags then they will retain their
-        uninitialised values, which surprise surprise, correspond
-        to the default values.  */
-      if (bfd_get_arch_info (ibfd)->the_default
-         && elf_elfheader (ibfd)->e_flags == 0)
+      /* If the input has no flags set, then do not set the output flags.
+        This will allow future bfds to determine the desired output flags.
+        If no input bfds have any flags set, then neither will the output bfd.
+
+        Note - we used to restrict this test to when the input architecture
+        variant was the default variant, but this does not allow for
+        linker scripts which override the default.  See PR 28910 for an
+        example.  */
+      if (in_flags == 0)
        return true;
-
+      
       elf_flags_init (obfd) = true;
       elf_elfheader (obfd)->e_flags = in_flags;