aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf32-i386.c1
-rw-r--r--bfd/elf64-x86-64.c1
-rw-r--r--bfd/elflink.c6
5 files changed, 17 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 5cd91ad..27bf827 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2009-07-10 Alan Modra <amodra@bigpond.net.au>
+
+ * 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 <amodra@bigpond.net.au>
* elf32-spu.c (mark_functions_via_relocs): Init broken_cycle field
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 764ee68..1690def 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 5ce7b27..c86d00d 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 274b874..6e868b3 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 9932186..4d54add 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)