From 466ee2af4a927fc6aaaaa62b0abd3b0cff9bcef7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 20 Apr 2016 05:34:02 -0700 Subject: [PATCH] Call _bfd_elf_create_ifunc_sections only for ifunc Since x86 check_relocs is called after opening all input files, we need to call _bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC symbols. * elf32-i386.c (elf_i386_check_relocs): Call _bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC symbol. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-i386.c | 9 ++++----- bfd/elf64-x86-64.c | 9 ++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a0304b6..46ee8fd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2016-04-20 H.J. Lu + * elf32-i386.c (elf_i386_check_relocs): Call + _bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC symbol. + * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. + +2016-04-20 H.J. Lu + * elf-bfd.h (_bfd_elf_link_check_relocs): New. * elflink.c (_bfd_elf_link_check_relocs): New function. (elf_link_add_object_symbols): Call _bfd_elf_link_check_relocs diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 470fcd1..0a2ac9d 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1603,10 +1603,6 @@ elf_i386_check_relocs (bfd *abfd, eh = (struct elf_i386_link_hash_entry *) h; if (h != NULL) { - /* Create the ifunc sections for static executables. If we - never see an indirect function symbol nor we are building - a static executable, those sections will be empty and - won't appear in output. */ switch (r_type) { default: @@ -1621,7 +1617,10 @@ elf_i386_check_relocs (bfd *abfd, case R_386_GOT32X: if (htab->elf.dynobj == NULL) htab->elf.dynobj = abfd; - if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info)) + /* Create the ifunc sections for static executables. */ + if (h->type == STT_GNU_IFUNC + && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj, + info)) return FALSE; break; } diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 5533b4a..197a1b8 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1712,10 +1712,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, if (h != NULL) { - /* Create the ifunc sections for static executables. If we - never see an indirect function symbol nor we are building - a static executable, those sections will be empty and - won't appear in output. */ switch (r_type) { default: @@ -1774,7 +1770,10 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_X86_64_GOTPCREL64: if (htab->elf.dynobj == NULL) htab->elf.dynobj = abfd; - if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info)) + /* Create the ifunc sections for static executables. */ + if (h->type == STT_GNU_IFUNC + && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj, + info)) return FALSE; break; } -- 2.7.4