* elf-bfd.h (struct elf_link_hash_entry): Clarify ref_regular
authorAlan Modra <amodra@gmail.com>
Fri, 10 Jul 2009 10:04:20 +0000 (10:04 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 10 Jul 2009 10:04:20 +0000 (10:04 +0000)
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
bfd/elf-bfd.h
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elflink.c

index 5cd91adcac3bf82409509702cbfe0019cb2e780e..27bf82740cfe6d577dc2d74f1d8b3b7bdfd149ff 100644 (file)
@@ -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
index 764ee68b2afd0397c639e4358abac60984cf4e39..1690def1c8d075d58f8a98af58f00c0439c78d1d 100644 (file)
@@ -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;
index 5ce7b2740c2e2964e0de977d1b5471636ce5deb7..c86d00da170639b3daad00f4262db9914ae1e81b 100644 (file)
@@ -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;
index 274b8746b7df98c21de53626c839d1b996ab3a1c..6e868b389df2efadb5c45a95072c4d08190914f3 100644 (file)
@@ -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;
index 9932186de9615e8c536666aef26bb413ab9b1acd..4d54adddb48a47a42ab1b9b311d23895da628da6 100644 (file)
@@ -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)