2001-06-07 Andreas Jaeger <aj@suse.de>
[binutils-gdb.git] / bfd / elf64-x86-64.c
index 6c7e98bd71c97a66646eb8807b8fefd740857e16..079c968814cc5fde2a60ad7d782ebb6d2333c1b6 100644 (file)
@@ -37,29 +37,41 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 static reloc_howto_type x86_64_elf_howto_table[] =
 {
   HOWTO(R_X86_64_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
-       bfd_elf_generic_reloc, "R_X86_64_NONE", false, 0x00000000, 0x00000000, false),
+       bfd_elf_generic_reloc, "R_X86_64_NONE", false, 0x00000000, 0x00000000,
+       false),
   HOWTO(R_X86_64_64, 0, 4, 64, false, 0, complain_overflow_bitfield,
-       bfd_elf_generic_reloc, "R_X86_64_64", false, MINUS_ONE, MINUS_ONE, false),
+       bfd_elf_generic_reloc, "R_X86_64_64", false, MINUS_ONE, MINUS_ONE,
+       false),
   HOWTO(R_X86_64_PC32, 0, 4, 32, true, 0, complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_PC32", false, 0xffffffff, 0xffffffff, true),
+       bfd_elf_generic_reloc, "R_X86_64_PC32", false, 0xffffffff, 0xffffffff,
+       true),
   HOWTO(R_X86_64_GOT32, 0, 4, 32, false, 0, complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_GOT32", false, 0xffffffff, 0xffffffff, false),
+       bfd_elf_generic_reloc, "R_X86_64_GOT32", false, 0xffffffff, 0xffffffff,
+       false),
   HOWTO(R_X86_64_PLT32, 0, 4, 32, true, 0, complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_PLT32", false, 0xffffffff, 0xffffffff, true),
+       bfd_elf_generic_reloc, "R_X86_64_PLT32", false, 0xffffffff, 0xffffffff,
+       true),
   HOWTO(R_X86_64_COPY, 0, 4, 32, false, 0, complain_overflow_bitfield,
-       bfd_elf_generic_reloc, "R_X86_64_COPY", false, 0xffffffff, 0xffffffff, false),
+       bfd_elf_generic_reloc, "R_X86_64_COPY", false, 0xffffffff, 0xffffffff,
+       false),
   HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, false, 0, complain_overflow_bitfield,
-       bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", false, MINUS_ONE, MINUS_ONE, false),
+       bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", false, MINUS_ONE,
+       MINUS_ONE, false),
   HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, false, 0, complain_overflow_bitfield,
-       bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", false, MINUS_ONE, MINUS_ONE, false),
+       bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", false, MINUS_ONE,
+       MINUS_ONE, false),
   HOWTO(R_X86_64_RELATIVE, 0, 4, 64, false, 0, complain_overflow_bitfield,
-       bfd_elf_generic_reloc, "R_X86_64_RELATIVE", false, MINUS_ONE, MINUS_ONE, false),
+       bfd_elf_generic_reloc, "R_X86_64_RELATIVE", false, MINUS_ONE,
+       MINUS_ONE, false),
   HOWTO(R_X86_64_GOTPCREL, 0, 4, 32, true,0 , complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", false, 0xffffffff, 0xffffffff, true),
+       bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", false, 0xffffffff,
+       0xffffffff, true),
   HOWTO(R_X86_64_32, 0, 4, 32, false, 0, complain_overflow_unsigned,
-       bfd_elf_generic_reloc, "R_X86_64_32", false, 0xffffffff, 0xffffffff, false),
+       bfd_elf_generic_reloc, "R_X86_64_32", false, 0xffffffff, 0xffffffff,
+       false),
   HOWTO(R_X86_64_32S, 0, 4, 32, false, 0, complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_32S", false, 0xffffffff, 0xffffffff, false),
+       bfd_elf_generic_reloc, "R_X86_64_32S", false, 0xffffffff, 0xffffffff,
+       false),
   HOWTO(R_X86_64_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
        bfd_elf_generic_reloc, "R_X86_64_16", false, 0xffff, 0xffff, false),
   HOWTO(R_X86_64_PC16,0, 1, 16, true, 0, complain_overflow_bitfield,
@@ -67,7 +79,16 @@ static reloc_howto_type x86_64_elf_howto_table[] =
   HOWTO(R_X86_64_8, 0, 0, 8, false, 0, complain_overflow_signed,
        bfd_elf_generic_reloc, "R_X86_64_8", false, 0xff, 0xff, false),
   HOWTO(R_X86_64_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
-       bfd_elf_generic_reloc, "R_X86_64_PC8", false, 0xff, 0xff, true)
+       bfd_elf_generic_reloc, "R_X86_64_PC8", false, 0xff, 0xff, true),
+
+/* GNU extension to record C++ vtable hierarchy.  */
+  HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, false, 0, complain_overflow_dont,
+        NULL, "R_X86_64_GNU_VTINHERIT", false, 0, 0, false),
+
+/* GNU extension to record C++ vtable member usage.  */
+  HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, false, 0, complain_overflow_dont,
+        _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", false, 0, 0,
+        false)
 };
 
 /* Map BFD relocs to the x86_64 elf relocs.  */
@@ -95,6 +116,8 @@ static CONST struct elf_reloc_map x86_64_reloc_map[] =
   { BFD_RELOC_16_PCREL,                R_X86_64_PC16, },
   { BFD_RELOC_8,               R_X86_64_8, },
   { BFD_RELOC_8_PCREL,         R_X86_64_PC8, },
+  { BFD_RELOC_VTABLE_INHERIT,  R_X86_64_GNU_VTINHERIT, },
+  { BFD_RELOC_VTABLE_ENTRY,    R_X86_64_GNU_VTENTRY, },
 };
 
 static reloc_howto_type *elf64_x86_64_reloc_type_lookup
@@ -145,11 +168,20 @@ elf64_x86_64_info_to_howto (abfd, cache_ptr, dst)
      arelent *cache_ptr;
      Elf64_Internal_Rela *dst;
 {
-  unsigned r_type;
+  unsigned r_type, i;
 
   r_type = ELF64_R_TYPE (dst->r_info);
-  BFD_ASSERT (r_type < (unsigned int) R_X86_64_max);
-  cache_ptr->howto = &x86_64_elf_howto_table[r_type];
+  if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT)
+    {
+      BFD_ASSERT (r_type <= (unsigned int) R_X86_64_PC8);
+      i = r_type;
+    }
+  else
+    {
+      BFD_ASSERT (r_type < (unsigned int) R_X86_64_max);
+      i = r_type - ((unsigned int) R_X86_64_GNU_VTINHERIT - R_X86_64_PC8 - 1);
+    }
+  cache_ptr->howto = &x86_64_elf_howto_table[i];
   BFD_ASSERT (r_type == cache_ptr->howto->type);
 }
 \f
@@ -460,16 +492,17 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
          if (h == NULL)
            continue;
 
+         h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
          if (h->plt.refcount == -1)
-           {
-             h->plt.refcount = 1;
-             h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
-           }
+           h->plt.refcount = 1;
          else
            h->plt.refcount += 1;
          break;
 
+       case R_X86_64_8:
+       case R_X86_64_16:
        case R_X86_64_32:
+       case R_X86_64_64:
        case R_X86_64_32S:
        case R_X86_64_PC32:
          if (h != NULL)
@@ -491,7 +524,9 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
             and symbol visibility changes render the symbol local.  */
          if (info->shared
              && (sec->flags & SEC_ALLOC) != 0
-             && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC32
+             && (((ELF64_R_TYPE (rel->r_info) != R_X86_64_PC8)
+                 && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC16)
+                 && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC32))
                  || (h != NULL
                      && (! info->symbolic
                          || (h->elf_link_hash_flags
@@ -527,7 +562,7 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
                        flags |= SEC_ALLOC | SEC_LOAD;
                      if (sreloc == NULL
                          || ! bfd_set_section_flags (dynobj, sreloc, flags)
-                         || ! bfd_set_section_alignment (dynobj, sreloc, 2))
+                         || ! bfd_set_section_alignment (dynobj, sreloc, 3))
                        return false;
                    }
                }
@@ -541,7 +576,9 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
                 elf64_x86_64 linker hash table, which means that h is
                 really a pointer to an elf64_x86_64_link_hash_entry.  */
              if (h != NULL
-                 && ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)
+                 && ((ELF64_R_TYPE (rel->r_info) == R_X86_64_PC8)
+                     || (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC16)
+                     || (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)))
                {
                  struct elf64_x86_64_link_hash_entry *eh;
                  struct elf64_x86_64_pcrel_relocs_copied *p;
@@ -568,6 +605,20 @@ elf64_x86_64_check_relocs (abfd, info, sec, relocs)
                }
            }
          break;
+
+         /* This relocation describes the C++ object vtable hierarchy.
+            Reconstruct it for later use during GC.  */
+       case R_X86_64_GNU_VTINHERIT:
+         if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return false;
+         break;
+
+         /* This relocation describes which C++ vtable entries are actually
+            used.  Record for later use during GC.  */
+       case R_X86_64_GNU_VTENTRY:
+         if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return false;
+         break;
        }
     }
 
@@ -587,17 +638,25 @@ elf64_x86_64_gc_mark_hook (abfd, info, rel, h, sym)
 {
   if (h != NULL)
     {
-      switch (h->root.type)
+      switch (ELF64_R_TYPE (rel->r_info))
        {
-       case bfd_link_hash_defined:
-       case bfd_link_hash_defweak:
-         return h->root.u.def.section;
-
-       case bfd_link_hash_common:
-         return h->root.u.c.p->section;
+       case R_X86_64_GNU_VTINHERIT:
+       case R_X86_64_GNU_VTENTRY:
+         break;
 
        default:
-         break;
+         switch (h->root.type)
+           {
+           case bfd_link_hash_defined:
+           case bfd_link_hash_defweak:
+             return h->root.u.def.section;
+
+           case bfd_link_hash_common:
+             return h->root.u.c.p->section;
+
+           default:
+             break;
+           }
        }
     }
   else
@@ -1096,7 +1155,7 @@ elf64_x86_64_discard_copies (h, inf)
 
 static boolean
 elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
-                            contents, relocs, local_syms, local_sections)
+                              contents, relocs, local_syms, local_sections)
      bfd *output_bfd;
      struct bfd_link_info *info;
      bfd *input_bfd;
@@ -1143,6 +1202,9 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
       unsigned int indx;
 
       r_type = ELF64_R_TYPE (rela->r_info);
+      if (r_type == (int) R_X86_64_GNU_VTINHERIT
+         || r_type == (int) R_X86_64_GNU_VTENTRY)
+       continue;
 
       if ((indx = (unsigned) r_type) >= R_X86_64_max)
        {
@@ -1194,11 +1256,10 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
              || h->root.type == bfd_link_hash_defweak)
            {
              sec = h->root.u.def.section;
-             if (r_type == R_X86_64_GOTPCREL
-                 || (r_type = R_X86_64_PLT32
-                     && splt != NULL
-                     && h->plt.offset != (bfd_vma) -1)
-                 || (r_type = R_X86_64_GOT32
+             if ((r_type == R_X86_64_PLT32
+                  && splt != NULL
+                  && h->plt.offset != (bfd_vma) -1)
+                 || ((r_type == R_X86_64_GOT32 || r_type == R_X86_64_GOTPCREL)
                      && elf_hash_table (info)->dynamic_sections_created
                      && (!info->shared
                          || (! info->symbolic && h->dynindx != -1)
@@ -1208,12 +1269,13 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
                      && ((! info->symbolic && h->dynindx != -1)
                          || (h->elf_link_hash_flags
                              & ELF_LINK_HASH_DEF_REGULAR) == 0)
-                     && ( r_type == R_X86_64_8 ||
-                          r_type == R_X86_64_16 ||
-                           r_type == R_X86_64_32 ||
-                          r_type == R_X86_64_64 ||
-                           r_type == R_X86_64_PC16 ||
-                          r_type == R_X86_64_PC32)
+                     && (r_type == R_X86_64_8
+                         || r_type == R_X86_64_16
+                         || r_type == R_X86_64_32
+                         || r_type == R_X86_64_64
+                         || r_type == R_X86_64_PC8
+                         || r_type == R_X86_64_PC16
+                         || r_type == R_X86_64_PC32)
                       && ((input_section->flags & SEC_ALLOC) != 0
                           /* DWARF will emit R_X86_64_32 relocations in its
                              sections against symbols defined externally
@@ -1265,92 +1327,10 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_X86_64_GOT32:
          /* Relocation is to the entry for this symbol in the global
             offset table.  */
-         BFD_ASSERT (sgot != NULL);
-
-         if (h != NULL)
-           {
-             bfd_vma off = h->got.offset;
-             BFD_ASSERT (off != (bfd_vma) -1);
-
-             if (! elf_hash_table (info)->dynamic_sections_created
-                 || (info->shared
-                     && (info->symbolic || h->dynindx == -1)
-                     && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
-               {
-                 /* This is actually a static link, or it is a -Bsymbolic
-                    link and the symbol is defined locally, or the symbol
-                    was forced to be local because of a version file.  We
-                    must initialize this entry in the global offset table.
-                    Since the offset must always be a multiple of 8, we
-                    use the least significant bit to record whether we
-                    have initialized it already.
-
-                    When doing a dynamic link, we create a .rela.got
-                    relocation entry to initialize the value.  This is
-                    done in the finish_dynamic_symbol routine.  */
-                 if ((off & 1) != 0)
-                   off &= ~1;
-                 else
-                   {
-                     bfd_put_64 (output_bfd, relocation,
-                                 sgot->contents + off);
-                     h->got.offset |= 1;
-                   }
-               }
-             relocation = sgot->output_offset + off;
-           }
-         else
-           {
-             bfd_vma off;
-
-             BFD_ASSERT (local_got_offsets != NULL
-                         && local_got_offsets[r_symndx] != (bfd_vma) -1);
-
-             off = local_got_offsets[r_symndx];
-
-             /* The offset must always be a multiple of 8.  We use
-                the least significant bit to record whether we have
-                already generated the necessary reloc.  */
-             if ((off & 1) != 0)
-               off &= ~1;
-             else
-               {
-                 bfd_put_64 (output_bfd, relocation, sgot->contents + off);
-
-                 if (info->shared)
-                   {
-                     asection *srelgot;
-                     Elf_Internal_Rela outrel;
-
-                     /* We need to generate a R_X86_64_RELATIVE reloc
-                        for the dynamic linker.  */
-                     srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
-                     BFD_ASSERT (srelgot != NULL);
-
-                     outrel.r_offset = (sgot->output_section->vma
-                                        + sgot->output_offset
-                                        + off);
-                     outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
-                     outrel.r_addend = relocation;
-                     bfd_elf64_swap_reloca_out (output_bfd, &outrel,
-                                                (((Elf64_External_Rela *)
-                                                  srelgot->contents)
-                                                 + srelgot->reloc_count));
-                     ++srelgot->reloc_count;
-                   }
-
-                 local_got_offsets[r_symndx] |= 1;
-               }
-
-             relocation = sgot->output_offset + off;
-           }
-
-         break;
-
        case R_X86_64_GOTPCREL:
          /* Use global offset table as symbol value.  */
-
          BFD_ASSERT (sgot != NULL);
+
          if (h != NULL)
            {
              bfd_vma off = h->got.offset;
@@ -1381,7 +1361,10 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
                      h->got.offset |= 1;
                    }
                }
-             relocation = sgot->output_offset + off;
+             if (r_type == R_X86_64_GOTPCREL)
+               relocation = sgot->output_section->vma + sgot->output_offset + off;
+             else
+               relocation = sgot->output_offset + off;
            }
          else
            {
@@ -1426,8 +1409,12 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
                  local_got_offsets[r_symndx] |= 1;
                }
 
-             relocation = sgot->output_section->vma + off;
+             if (r_type == R_X86_64_GOTPCREL)
+               relocation = sgot->output_section->vma + sgot->output_offset + off;
+             else
+               relocation = sgot->output_offset + off;
            }
+
          break;
 
        case R_X86_64_PLT32:
@@ -1455,14 +1442,16 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_X86_64_8:
        case R_X86_64_16:
        case R_X86_64_32:
+       case R_X86_64_64:
        case R_X86_64_PC8:
        case R_X86_64_PC16:
        case R_X86_64_PC32:
-         /* FIXME: The abi says the linker should make sure the value is
+         /* FIXME: The ABI says the linker should make sure the value is
             the same when it's zeroextended to 64 bit.  */
          if (info->shared
              && (input_section->flags & SEC_ALLOC) != 0
-             && ((r_type != R_X86_64_PC8 && r_type != R_X86_64_PC16
+             && ((r_type != R_X86_64_PC8
+                  && r_type != R_X86_64_PC16
                   && r_type != R_X86_64_PC32)
                  || (h != NULL
                      && h->dynindx != -1
@@ -1523,7 +1512,8 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
                  memset (&outrel, 0, sizeof outrel);
                  relocate = false;
                }
-             else if ((r_type == R_X86_64_PC8) || (r_type == R_X86_64_PC16)
+             else if ((r_type == R_X86_64_PC8)
+                      || (r_type == R_X86_64_PC16)
                       || (r_type == R_X86_64_PC32))
                {
                  BFD_ASSERT (h != NULL && h->dynindx != -1);
@@ -1654,7 +1644,7 @@ elf64_x86_64_finish_dynamic_symbol (output_bfd, info, h, sym)
 
       /* Get the offset into the .got table of the entry that
         corresponds to this function.  Each .got entry is GOT_ENTRY_SIZE
-        bytes. The first three are reserved.  */
+        bytes. The first three are reserved for the dynamic linker.  */
       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
 
       /* Fill in the entry in the procedure linkage table.  */
@@ -1713,6 +1703,53 @@ elf64_x86_64_finish_dynamic_symbol (output_bfd, info, h, sym)
        }
     }
 
+  if (h->got.offset != (bfd_vma) -1)
+    {
+      asection *sgot;
+      asection *srela;
+      Elf_Internal_Rela rela;
+
+      /* This symbol has an entry in the global offset table.  Set it
+         up.  */
+
+      sgot = bfd_get_section_by_name (dynobj, ".got");
+      srela = bfd_get_section_by_name (dynobj, ".rela.got");
+      BFD_ASSERT (sgot != NULL && srela != NULL);
+
+      rela.r_offset = (sgot->output_section->vma
+                      + sgot->output_offset
+                      + (h->got.offset &~ 1));
+
+      /* If this is a static link, or it is a -Bsymbolic link and the
+        symbol is defined locally or was forced to be local because
+        of a version file, we just want to emit a RELATIVE reloc.
+        The entry in the global offset table will already have been
+        initialized in the relocate_section function.  */
+      if (! elf_hash_table (info)->dynamic_sections_created
+         || (info->shared
+             && (info->symbolic || h->dynindx == -1)
+             && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
+       {
+         BFD_ASSERT((h->got.offset & 1) != 0);
+         rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
+         rela.r_addend = (h->root.u.def.value
+                          + h->root.u.def.section->output_section->vma
+                          + h->root.u.def.section->output_offset);
+       }
+      else
+       {
+         BFD_ASSERT((h->got.offset & 1) == 0);
+         bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
+         rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
+         rela.r_addend = 0;
+       }
+
+      bfd_elf64_swap_reloca_out (output_bfd, &rela,
+                                ((Elf64_External_Rela *) srela->contents
+                                 + srela->reloc_count));
+      ++srela->reloc_count;
+    }
+
   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
     {
       asection *s;
@@ -1784,7 +1821,7 @@ elf64_x86_64_finish_dynamic_sections (output_bfd, info)
          switch (dyn.d_tag)
            {
            default:
-             break;
+             continue;
 
            case DT_PLTGOT:
              name = ".got";
@@ -1822,7 +1859,6 @@ elf64_x86_64_finish_dynamic_sections (output_bfd, info)
                (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size);
              break;
            }
-
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
        }
 
@@ -1881,49 +1917,12 @@ elf64_x86_64_finish_dynamic_sections (output_bfd, info)
   return true;
 }
 
-/*
- * Why was the hash table entry size definition changed from
- * ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
- * this is the only reason for the elf64_x86_64_size_info structure.
- */
-
-const struct elf_size_info elf64_86_64_size_info =
-{
-  sizeof (Elf64_External_Ehdr),
-  sizeof (Elf64_External_Phdr),
-  sizeof (Elf64_External_Shdr),
-  sizeof (Elf64_External_Rel),
-  sizeof (Elf64_External_Rela),
-  sizeof (Elf64_External_Sym),
-  sizeof (Elf64_External_Dyn),
-  sizeof (Elf_External_Note),
-  8,           /* hash-table entry size */
-  1,           /* internal relocations per external relocations */
-  64,          /* arch_size */
-  8,           /* file_align */
-  ELFCLASS64, EV_CURRENT,
-  bfd_elf64_write_out_phdrs,
-  bfd_elf64_write_shdrs_and_ehdr,
-  bfd_elf64_write_relocs,
-  bfd_elf64_swap_symbol_out,
-  bfd_elf64_slurp_reloc_table,
-  bfd_elf64_slurp_symbol_table,
-  bfd_elf64_swap_dyn_in,
-  bfd_elf64_swap_dyn_out,
-  NULL,
-  NULL,
-  NULL,
-  NULL
-};
-
 #define TARGET_LITTLE_SYM                  bfd_elf64_x86_64_vec
 #define TARGET_LITTLE_NAME                 "elf64-x86-64"
 #define ELF_ARCH                           bfd_arch_i386
 #define ELF_MACHINE_CODE                   EM_X86_64
 #define ELF_MAXPAGESIZE                            0x100000
 
-#define elf_backend_size_info              elf64_86_64_size_info
-
 #define elf_backend_can_gc_sections        1
 #define elf_backend_want_got_plt           1
 #define elf_backend_plt_readonly           1