From b7a18930e3925c4092bd975e95bc3603aa1418d9 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 7 Aug 2017 10:09:51 +0100 Subject: [PATCH] Do not choose a non-ELF format input file to hold the linker created GOT sections. 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 | 10 ++++++++++ bfd/elf32-i386.c | 39 ++++++++++++++++++++++++--------------- bfd/elf64-x86-64.c | 5 +++-- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 49ef45f4290..694675f1380 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2017-08-07 Nick Clifton + + 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 * elf32-i386.c (elf_i386_link_hash_entry): Change tls_get_addr diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 14f018ea2cb..f1fcd21072d 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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)) diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index e5f4681354a..83643842ee1 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -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; -- 2.30.2