diff options
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r-- | bfd/elf64-x86-64.c | 17 |
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) |