* Makefile.def (install-target-libgo): Depend on
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index ec38ddc1d1921897642b72d591cd1438e2c83cc0..a37f793e232ee1b0adb1bb24953c704c62b89a4e 100644 (file)
@@ -1522,82 +1522,8 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
              break;
            }
 
-         /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
-            it here if it is defined in a non-shared object.  */
-         if (h->type == STT_GNU_IFUNC
-             && h->def_regular)
-           {
-             /* 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;
-
-             /* STT_GNU_IFUNC needs dynamic sections.  */
-             if (htab->elf.dynobj == NULL)
-               htab->elf.dynobj = abfd;
-
-             switch (r_type)
-               {
-               default:
-                 if (h->root.root.string)
-                   name = h->root.root.string;
-                 else
-                   name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
-                                            NULL);
-                 (*_bfd_error_handler)
-                   (_("%B: relocation %s against STT_GNU_IFUNC "
-                      "symbol `%s' isn't handled by %s"), abfd,
-                    x86_64_elf_howto_table[r_type].name,
-                    name, __FUNCTION__);
-                 bfd_set_error (bfd_error_bad_value);
-                 return FALSE;
-
-               case R_X86_64_32:
-                 if (ABI_64_P (abfd))
-                   goto not_pointer;
-               case R_X86_64_64:
-                 h->non_got_ref = 1;
-                 h->pointer_equality_needed = 1;
-                 if (info->shared)
-                   {
-                     /* We must copy these reloc types into the output
-                        file.  Create a reloc section in dynobj and
-                        make room for this reloc.  */
-                     sreloc = _bfd_elf_create_ifunc_dyn_reloc
-                       (abfd, info, sec, sreloc,
-                        &((struct elf_x86_64_link_hash_entry *) h)->dyn_relocs);
-                     if (sreloc == NULL)
-                       return FALSE;
-                   }
-                 break;
-
-               case R_X86_64_32S:
-               case R_X86_64_PC32:
-               case R_X86_64_PC64:
-not_pointer:
-                 h->non_got_ref = 1;
-                 if (r_type != R_X86_64_PC32
-                     && r_type != R_X86_64_PC64)
-                   h->pointer_equality_needed = 1;
-                 break;
-
-               case R_X86_64_PLT32:
-                 break;
-
-               case R_X86_64_GOTPCREL:
-               case R_X86_64_GOTPCREL64:
-                 h->got.refcount += 1;
-                 if (htab->elf.sgot == NULL
-                     && !_bfd_elf_create_got_section (htab->elf.dynobj,
-                                                      info))
-                   return FALSE;
-                 break;
-               }
-
-             continue;
-           }
+         /* It is referenced by a non-shared object. */
+         h->ref_regular = 1;
        }
 
       if (! elf_x86_64_tls_transition (info, abfd, sec, NULL,
@@ -2140,11 +2066,12 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
   /* STT_GNU_IFUNC symbol must go through PLT. */
   if (h->type == STT_GNU_IFUNC)
     {
-      /* Check local STT_GNU_IFUNC calls.  */
+      /* All local STT_GNU_IFUNC references must be treate as local
+        calls via local PLT.  */
       if (h->ref_regular
          && SYMBOL_CALLS_LOCAL (info, h))
        {
-         bfd_size_type pc_count = 0;
+         bfd_size_type pc_count = 0, count = 0;
          struct elf_dyn_relocs **pp;
 
          eh = (struct elf_x86_64_link_hash_entry *) h;
@@ -2153,13 +2080,14 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
              pc_count += p->pc_count;
              p->count -= p->pc_count;
              p->pc_count = 0;
+             count += p->count;
              if (p->count == 0)
                *pp = p->next;
              else
                pp = &p->next;
            }
 
-         if (pc_count)
+         if (pc_count || count)
            {
              h->needs_plt = 1;
              h->plt.refcount += 1;
This page took 0.040547 seconds and 4 git commands to generate.