Re: ELF final_write_processing
authorAlan Modra <amodra@gmail.com>
Wed, 24 Jul 2019 00:41:08 +0000 (10:11 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 24 Jul 2019 06:42:01 +0000 (16:12 +0930)
I missed some early exits from final_write_processing that mean
_bfd_elf_final_write_processing could be missed.

* elf-vxworks.c (elf_vxworks_final_write_processing): Don't return
early.
* elf32-arc.c (arc_elf_final_write_processing): Likewise.
* elf32-xtensa.c (elf_xtensa_final_write_processing): Likewise.

bfd/ChangeLog
bfd/elf-vxworks.c
bfd/elf32-arc.c
bfd/elf32-xtensa.c

index a309957..1fe3860 100644 (file)
@@ -1,5 +1,12 @@
 2019-07-24  Alan Modra  <amodra@gmail.com>
 
+       * elf-vxworks.c (elf_vxworks_final_write_processing): Don't return
+       early.
+       * elf32-arc.c (arc_elf_final_write_processing): Likewise.
+       * elf32-xtensa.c (elf_xtensa_final_write_processing): Likewise.
+
+2019-07-24  Alan Modra  <amodra@gmail.com>
+
        * elf32-visium.c (visium_elf_post_process_headers): Don't set
        EI_OSABI header byte here.
        (ELF_OSABI): Define.
index 32eb5a9..4447b36 100644 (file)
@@ -221,13 +221,14 @@ elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
   sec = bfd_get_section_by_name (abfd, ".rel.plt.unloaded");
   if (!sec)
     sec = bfd_get_section_by_name (abfd, ".rela.plt.unloaded");
-  if (!sec)
-    return;
-  d = elf_section_data (sec);
-  d->this_hdr.sh_link = elf_onesymtab (abfd);
-  sec = bfd_get_section_by_name (abfd, ".plt");
   if (sec)
-    d->this_hdr.sh_info = elf_section_data (sec)->this_idx;
+    {
+      d = elf_section_data (sec);
+      d->this_hdr.sh_link = elf_onesymtab (abfd);
+      sec = bfd_get_section_by_name (abfd, ".plt");
+      if (sec)
+       d->this_hdr.sh_info = elf_section_data (sec)->this_idx;
+    }
   _bfd_elf_final_write_processing (abfd, linker);
 }
 
index ad5757a..fc4c3ae 100644 (file)
@@ -1026,20 +1026,12 @@ arc_elf_final_write_processing (bfd *abfd, bfd_boolean linker)
 
   switch (bfd_get_mach (abfd))
     {
-    case bfd_mach_arc_arc600:
-      emf = EM_ARC_COMPACT;
-      break;
-    case bfd_mach_arc_arc601:
-      emf = EM_ARC_COMPACT;
-      break;
-    case bfd_mach_arc_arc700:
-      emf = EM_ARC_COMPACT;
-      break;
     case bfd_mach_arc_arcv2:
       emf = EM_ARC_COMPACT2;
       break;
     default:
-      return;
+      emf = EM_ARC_COMPACT;
+      break;
     }
 
   elf_elfheader (abfd)->e_machine = emf;
@@ -1050,7 +1042,7 @@ arc_elf_final_write_processing (bfd *abfd, bfd_boolean linker)
   else
     e_flags |= E_ARC_OSABI_V3;
 
-  elf_elfheader (abfd)->e_flags |=  e_flags;
+  elf_elfheader (abfd)->e_flags |= e_flags;
   _bfd_elf_final_write_processing (abfd, linker);
 }
 
index 66d23a8..40edb46 100644 (file)
@@ -3466,7 +3466,7 @@ static void
 elf_xtensa_final_write_processing (bfd *abfd, bfd_boolean linker)
 {
   int mach;
-  unsigned long val;
+  unsigned long val = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
 
   switch (mach = bfd_get_mach (abfd))
     {
@@ -3474,10 +3474,10 @@ elf_xtensa_final_write_processing (bfd *abfd, bfd_boolean linker)
       val = E_XTENSA_MACH;
       break;
     default:
-      return;
+      break;
     }
 
-  elf_elfheader (abfd)->e_flags &=  (~ EF_XTENSA_MACH);
+  elf_elfheader (abfd)->e_flags &= ~EF_XTENSA_MACH;
   elf_elfheader (abfd)->e_flags |= val;
   _bfd_elf_final_write_processing (abfd, linker);
 }