summaryrefslogtreecommitdiff
path: root/bfd/elf64-x86-64.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r--bfd/elf64-x86-64.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index de6f6ecd242..6db647207b4 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3716,6 +3716,23 @@ elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
{
struct elf64_x86_64_link_hash_table *htab;
+ /* PR 10433: STT_GNU_IFUNC symbols must go through the PLT
+ only when they are referenced, not when they are defined. */
+ if (h->type == STT_GNU_IFUNC
+ && h->def_regular
+ && ! h->ref_regular
+ && ! info->relocatable)
+ {
+ if (! ((h->dynindx != -1
+ || h->forced_local)
+ && ((info->shared
+ && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+ || h->root.type != bfd_link_hash_undefweak))
+ || ! h->forced_local)
+ && elf_hash_table (info)->dynamic_sections_created))
+ return TRUE;
+ }
+
htab = elf64_x86_64_hash_table (info);
if (h->plt.offset != (bfd_vma) -1)