This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Call _bfd_elf_create_ifunc_sections only for ifunc
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: binutils at sourceware dot org
- Date: Wed, 20 Apr 2016 05:36:32 -0700
- Subject: [PATCH] Call _bfd_elf_create_ifunc_sections only for ifunc
- Authentication-results: sourceware.org; auth=none
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 <hongjiu.lu@intel.com>
+ * 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 <hongjiu.lu@intel.com>
+
* 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.5.5