From 7ae26bc141a487736f8590300fa40cf58daf4123 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 10 Jul 2009 10:04:20 +0000 Subject: [PATCH] * elf-bfd.h (struct elf_link_hash_entry): Clarify ref_regular and ref_regular_nonweak comment. * elflink.c (elf_link_output_extsym): Special case ifunc syms when def_regular, not ref_regular. (elf_link_add_object_symbols): Don't set needs_plt on ifunc syms,.. * elf32-i386.c (elf_i386_check_relocs): ..set it here instead.. * elf64-x86-64.c (elf64_x86_64_check_relocs): ..and here. --- bfd/ChangeLog | 10 ++++++++++ bfd/elf-bfd.h | 6 ++++-- bfd/elf32-i386.c | 1 + bfd/elf64-x86-64.c | 1 + bfd/elflink.c | 6 +----- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5cd91adcac..27bf82740c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2009-07-10 Alan Modra + + * elf-bfd.h (struct elf_link_hash_entry): Clarify ref_regular + and ref_regular_nonweak comment. + * elflink.c (elf_link_output_extsym): Special case ifunc syms + when def_regular, not ref_regular. + (elf_link_add_object_symbols): Don't set needs_plt on ifunc syms,.. + * elf32-i386.c (elf_i386_check_relocs): ..set it here instead.. + * elf64-x86-64.c (elf64_x86_64_check_relocs): ..and here. + 2009-07-09 Alan Modra * elf32-spu.c (mark_functions_via_relocs): Init broken_cycle field diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 764ee68b2a..1690def1c8 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -138,7 +138,8 @@ struct elf_link_hash_entry /* Symbol st_other value, symbol visibility. */ unsigned int other : 8; - /* Symbol is referenced by a non-shared object. */ + /* Symbol is referenced by a non-shared object (other than the object + in which it is defined). */ unsigned int ref_regular : 1; /* Symbol is defined by a non-shared object. */ unsigned int def_regular : 1; @@ -146,7 +147,8 @@ struct elf_link_hash_entry unsigned int ref_dynamic : 1; /* Symbol is defined by a shared object. */ unsigned int def_dynamic : 1; - /* Symbol has a non-weak reference from a non-shared object. */ + /* Symbol has a non-weak reference from a non-shared object (other than + the object in which it is defined). */ unsigned int ref_regular_nonweak : 1; /* Dynamic symbol has been adjustd. */ unsigned int dynamic_adjusted : 1; diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 5ce7b2740c..c86d00da17 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1366,6 +1366,7 @@ elf_i386_check_relocs (bfd *abfd, { /* It is referenced by a non-shared object. */ h->ref_regular = 1; + h->needs_plt = 1; /* STT_GNU_IFUNC symbol must go through PLT. */ h->plt.refcount += 1; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 274b8746b7..6e868b389d 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1150,6 +1150,7 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, { /* It is referenced by a non-shared object. */ h->ref_regular = 1; + h->needs_plt = 1; /* STT_GNU_IFUNC symbol must go through PLT. */ h->plt.refcount += 1; diff --git a/bfd/elflink.c b/bfd/elflink.c index 9932186de9..4d54adddb4 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4290,10 +4290,6 @@ error_free_dyn: h->type = ELF_ST_TYPE (isym->st_info); } - /* STT_GNU_IFUNC symbol must go through PLT. */ - if (h->type == STT_GNU_IFUNC) - h->needs_plt = 1; - /* Merge st_other field. */ elf_merge_st_other (abfd, h, isym, definition, dynamic); @@ -8657,7 +8653,7 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) forced local syms when non-shared is due to a historical quirk. STT_GNU_IFUNC symbol must go through PLT. */ if ((h->type == STT_GNU_IFUNC - && h->ref_regular + && h->def_regular && !finfo->info->relocatable) || ((h->dynindx != -1 || h->forced_local) -- 2.34.1