RISC-V: Don't check ABI flags if no code section.
authorJim Wilson <jimw@sifive.com>
Tue, 2 Apr 2019 20:30:07 +0000 (13:30 -0700)
committerJim Wilson <jimw@sifive.com>
Tue, 2 Apr 2019 20:30:07 +0000 (13:30 -0700)
This fixes a glib build failure reported in PR 24389.  Using ld -b binary
creates an object file with no elf header flags set which has the wrong ABI
info for riscv64-linux.  But the file also has no code sections, so I added
code borrowed from the arm port that only checks the ELF header ABI flags if
there is a code section.

bfd/
PR 24389
* elfnn-riscv.c (_bfd_riscv_elf_merge_private_bfd_data): Move read of
ELF header flags to after check for ELF object file.  Loop through
sections looking for code sections, if none, then skip ABI checks.

bfd/ChangeLog
bfd/elfnn-riscv.c

index 2c630be735fa888432855ff296f10076a7109a64..ca5a3a1176b3067224185a6df27bf584e09438f7 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-02  Jim Wilson  <jimw@sifive.com>
+
+       PR 24389
+       * elfnn-riscv.c (_bfd_riscv_elf_merge_private_bfd_data): Move read of
+       ELF header flags to after check for ELF object file.  Loop through
+       sections looking for code sections, if none, then skip ABI checks.
+
 2019-03-30  Andrew Waterman  <andrew@sifive.com>
 
        * elfnn-riscv.c (_bfd_riscv_relax_call): Only check ARCH_SIZE for
index dba1025994fbc2d5e37d4ac6b2feba181dd8de1c..964b6bdcbcc6caef76b14584d74d77ef4e15bd96 100644 (file)
@@ -3086,8 +3086,7 @@ static bfd_boolean
 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 {
   bfd *obfd = info->output_bfd;
-  flagword new_flags = elf_elfheader (ibfd)->e_flags;
-  flagword old_flags = elf_elfheader (obfd)->e_flags;
+  flagword new_flags, old_flags;
 
   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
     return TRUE;
@@ -3107,6 +3106,9 @@ _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   if (!riscv_merge_attributes (ibfd, info))
     return FALSE;
 
+  new_flags = elf_elfheader (ibfd)->e_flags;
+  old_flags = elf_elfheader (obfd)->e_flags;
+
   if (! elf_flags_init (obfd))
     {
       elf_flags_init (obfd) = TRUE;
@@ -3114,6 +3116,34 @@ _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
       return TRUE;
     }
 
+  /* Check to see if the input BFD actually contains any sections.  If not,
+     its flags may not have been initialized either, but it cannot actually
+     cause any incompatibility.  Do not short-circuit dynamic objects; their
+     section list may be emptied by elf_link_add_object_symbols.
+
+     Also check to see if there are no code sections in the input.  In this
+     case, there is no need to check for code specific flags.  */
+  if (!(ibfd->flags & DYNAMIC))
+    {
+      bfd_boolean null_input_bfd = TRUE;
+      bfd_boolean only_data_sections = TRUE;
+      asection *sec;
+
+      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
+       {
+         if ((bfd_get_section_flags (ibfd, sec)
+              & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
+             == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
+           only_data_sections = FALSE;
+
+         null_input_bfd = FALSE;
+         break;
+       }
+
+      if (null_input_bfd || only_data_sections)
+       return TRUE;
+    }
+
   /* Disallow linking different float ABIs.  */
   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
     {