Do not choose a non-ELF format input file to hold the linker created GOT sections.
authorNick Clifton <nickc@redhat.com>
Mon, 7 Aug 2017 09:09:51 +0000 (10:09 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 7 Aug 2017 09:09:51 +0000 (10:09 +0100)
PR 21884
* elf32-i386.c (elf_i386_link_setup_gnu_properties): If the dynobj
has not been set then use the bfd returned by
_bfd_elf_link_setup_gnu_properties.  If that is null then search
through all the input bfds selecting the first normal, ELF format
one.
* elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties): Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c

index 49ef45f..694675f 100644 (file)
@@ -1,3 +1,13 @@
+2017-08-07  Nick Clifton  <nickc@redhat.com>
+
+       PR 21884
+       * elf32-i386.c (elf_i386_link_setup_gnu_properties): If the dynobj
+       has not been set then use the bfd returned by
+       _bfd_elf_link_setup_gnu_properties.  If that is null then search
+       through all the input bfds selecting the first normal, ELF format
+       one.
+       * elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties): Likewise.
+
 2017-08-06  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_link_hash_entry): Change tls_get_addr
index 14f018e..f1fcd21 100644 (file)
@@ -6886,20 +6886,29 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
      set it in check_relocs.  */
   if (dynobj == NULL)
     {
-      bfd *abfd;
-
-      /* Find a normal input file to hold linker created
-        sections.  */
-      for (abfd = info->input_bfds;
-          abfd != NULL;
-          abfd = abfd->link.next)
-       if ((abfd->flags
-            & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
-         {
-           htab->elf.dynobj = abfd;
-           dynobj = abfd;
-           break;
-         }
+      if (pbfd != NULL)
+       {
+         htab->elf.dynobj = pbfd;
+         dynobj = pbfd;
+       }
+      else
+       {
+         bfd *abfd;
+
+         /* Find a normal input file to hold linker created
+            sections.  */
+         for (abfd = info->input_bfds;
+              abfd != NULL;
+              abfd = abfd->link.next)
+           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+               && (abfd->flags
+                   & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
+             {
+               htab->elf.dynobj = abfd;
+               dynobj = abfd;
+               break;
+             }
+       }
     }
 
   /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
@@ -6991,7 +7000,7 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
     return pbfd;
 
   /* Since create_dynamic_sections isn't always called, but GOT
-     relocations need GOT relocations, create them here so that we
+     relocations need GOT sections, create them here so that we
      don't need to do it in check_relocs.  */
   if (htab->elf.sgot == NULL
       && !_bfd_elf_create_got_section (dynobj, info))
index e5f4681..8364384 100644 (file)
@@ -7427,8 +7427,9 @@ error_alignment:
          for (abfd = info->input_bfds;
               abfd != NULL;
               abfd = abfd->link.next)
-           if ((abfd->flags
-                & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
+           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+               && (abfd->flags
+                   & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
              {
                htab->elf.dynobj = abfd;
                dynobj = abfd;