Revert commit 240d6706c6a2
[binutils-gdb.git] / bfd / coff-x86_64.c
index ec78fbfafd299d050d68c43b653c64fdb089979b..c2da0f4d1ae22ceb148d59de03f3f8ad4dd8b77c 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for AMD 64 COFF files.
 /* BFD back-end for AMD 64 COFF files.
-   Copyright 2006, 2007, 2008  Free Software Foundation, Inc.
+   Copyright (C) 2006-2022 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
 
    This file is part of BFD, the Binary File Descriptor library.
 
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.
-   
-   Written by Kai Tietz, OneVision Software GmbH&CoKg.  */
 
 
-#ifndef COFF_WITH_pex64
-#define COFF_WITH_pex64
-#endif
+   Written by Kai Tietz, OneVision Software GmbH&CoKg.  */
 
 
+/* Note we have to make sure not to include headers twice.
+   Not all headers are wrapped in #ifdef guards, so we define
+   PEI_HEADERS to prevent double including here.  */
+#ifndef PEI_HEADERS
 #include "sysdep.h"
 #include "bfd.h"
 #include "libbfd.h"
 #include "coff/x86_64.h"
 #include "coff/internal.h"
 #include "sysdep.h"
 #include "bfd.h"
 #include "libbfd.h"
 #include "coff/x86_64.h"
 #include "coff/internal.h"
-#include "coff/pe.h"
 #include "libcoff.h"
 #include "libiberty.h"
 #include "libcoff.h"
 #include "libiberty.h"
+#endif
 
 #define BADMAG(x) AMD64BADMAG(x)
 
 
 #define BADMAG(x) AMD64BADMAG(x)
 
@@ -47,6 +47,9 @@
 
 #define COFF_PAGE_SIZE 0x1000
 
 
 #define COFF_PAGE_SIZE 0x1000
 
+/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1.  */
+#define OCTETS_PER_BYTE(ABFD, SEC) 1
+
 /* For some reason when using AMD COFF the value stored in the .text
    section for a reference to a common symbol is the value itself plus
    any desired offset.  Ian Taylor, Cygnus Support.  */
 /* For some reason when using AMD COFF the value stored in the .text
    section for a reference to a common symbol is the value itself plus
    any desired offset.  Ian Taylor, Cygnus Support.  */
@@ -67,14 +70,14 @@ coff_amd64_reloc (bfd *abfd,
 {
   symvalue diff;
 
 {
   symvalue diff;
 
-#if !defined(COFF_WITH_PE)
+#if !defined (COFF_WITH_PE)
   if (output_bfd == NULL)
     return bfd_reloc_continue;
 #endif
 
   if (bfd_is_com_section (symbol->section))
     {
   if (output_bfd == NULL)
     return bfd_reloc_continue;
 #endif
 
   if (bfd_is_com_section (symbol->section))
     {
-#if !defined(COFF_WITH_PE)
+#if !defined (COFF_WITH_PE)
       /* We are relocating a common symbol.  The current value in the
         object file is ORIG + OFFSET, where ORIG is the value of the
         common symbol as seen by the object file when it was compiled
       /* We are relocating a common symbol.  The current value in the
         object file is ORIG + OFFSET, where ORIG is the value of the
         common symbol as seen by the object file when it was compiled
@@ -98,21 +101,10 @@ coff_amd64_reloc (bfd *abfd,
         ignores the addend for a COFF target when producing
         relocatable output.  This seems to be always wrong for 386
         COFF, so we handle the addend here instead.  */
         ignores the addend for a COFF target when producing
         relocatable output.  This seems to be always wrong for 386
         COFF, so we handle the addend here instead.  */
-#if defined(COFF_WITH_PE)
+#if defined (COFF_WITH_PE)
       if (output_bfd == NULL)
        {
       if (output_bfd == NULL)
        {
-         reloc_howto_type *howto = reloc_entry->howto;
-
-         /* Although PC relative relocations are very similar between
-            PE and non-PE formats, but they are off by 1 << howto->size
-            bytes. For the external relocation, PE is very different
-            from others. See md_apply_fix3 () in gas/config/tc-amd64.c.
-            When we link PE and non-PE object files together to
-            generate a non-PE executable, we have to compensate it
-            here.  */
-         if(howto->pc_relative && howto->pcrel_offset)
-           diff = -(1 << howto->size);
-         else if(symbol->flags & BSF_WEAK)
+         if (symbol->flags & BSF_WEAK)
            diff = reloc_entry->addend - symbol->value;
          else
            diff = -reloc_entry->addend;
            diff = reloc_entry->addend - symbol->value;
          else
            diff = -reloc_entry->addend;
@@ -122,59 +114,104 @@ coff_amd64_reloc (bfd *abfd,
        diff = reloc_entry->addend;
     }
 
        diff = reloc_entry->addend;
     }
 
-#if defined(COFF_WITH_PE)
-  /* FIXME: How should this case be handled?  */
+#if defined (COFF_WITH_PE)
+  if (output_bfd == NULL)
+    {
+      /* PC relative relocations are off by their size.  */
+      if (reloc_entry->howto->pc_relative)
+       diff -= bfd_get_reloc_size (reloc_entry->howto);
+
+      if (reloc_entry->howto->type >= R_AMD64_PCRLONG_1
+         && reloc_entry->howto->type <= R_AMD64_PCRLONG_5)
+       diff -= reloc_entry->howto->type - R_AMD64_PCRLONG;
+    }
+
   if (reloc_entry->howto->type == R_AMD64_IMAGEBASE
   if (reloc_entry->howto->type == R_AMD64_IMAGEBASE
-      && output_bfd != NULL
-      && bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
-    diff -= pe_data (output_bfd)->pe_opthdr.ImageBase;
+      && output_bfd == NULL)
+    {
+      bfd *obfd = input_section->output_section->owner;
+      struct bfd_link_info *link_info;
+      struct bfd_link_hash_entry *h;
+      switch (bfd_get_flavour (obfd))
+       {
+       case bfd_target_coff_flavour:
+         diff -= pe_data (obfd)->pe_opthdr.ImageBase;
+         break;
+       case bfd_target_elf_flavour:
+         /* Subtract __ImageBase.  */
+         link_info = _bfd_get_link_info (obfd);
+         if (link_info == NULL)
+           return bfd_reloc_dangerous;
+         h = bfd_link_hash_lookup (link_info->hash, "__ImageBase",
+                                   false, false, false);
+         if (h == NULL)
+           return bfd_reloc_dangerous;
+         while (h->type == bfd_link_hash_indirect)
+           h = h->u.i.link;
+         /* ELF symbols in relocatable files are section relative,
+            but in nonrelocatable files they are virtual addresses.  */
+         diff -= (h->u.def.value
+                  + h->u.def.section->output_offset
+                  + h->u.def.section->output_section->vma);
+         break;
+       default:
+         break;
+       }
+    }
 #endif
 
 #define DOIT(x) \
   x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
 
 #endif
 
 #define DOIT(x) \
   x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
 
-    if (diff != 0)
-      {
-       reloc_howto_type *howto = reloc_entry->howto;
-       unsigned char *addr = (unsigned char *) data + reloc_entry->address;
+  if (diff != 0)
+    {
+      reloc_howto_type *howto = reloc_entry->howto;
+      bfd_size_type octets = (reloc_entry->address
+                             * OCTETS_PER_BYTE (abfd, input_section));
+      unsigned char *addr = (unsigned char *) data + octets;
+
+      if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets))
+       return bfd_reloc_outofrange;
+
+      switch (howto->size)
+       {
+       case 0:
+         {
+           char x = bfd_get_8 (abfd, addr);
+           DOIT (x);
+           bfd_put_8 (abfd, x, addr);
+         }
+         break;
 
 
-       switch (howto->size)
+       case 1:
          {
          {
-         case 0:
-           {
-             char x = bfd_get_8 (abfd, addr);
-             DOIT (x);
-             bfd_put_8 (abfd, x, addr);
-           }
-           break;
-
-         case 1:
-           {
-             short x = bfd_get_16 (abfd, addr);
-             DOIT (x);
-             bfd_put_16 (abfd, (bfd_vma) x, addr);
-           }
-           break;
-
-         case 2:
-           {
-             long x = bfd_get_32 (abfd, addr);
-             DOIT (x);
-             bfd_put_32 (abfd, (bfd_vma) x, addr);
-           }
-           break;
-         case 4:
-           {
-             long long x = bfd_get_64 (abfd, addr);
-             DOIT (x);
-             bfd_put_64 (abfd, (bfd_vma) x, addr);
-           }
-           break;
-
-         default:
-           abort ();
+           short x = bfd_get_16 (abfd, addr);
+           DOIT (x);
+           bfd_put_16 (abfd, (bfd_vma) x, addr);
          }
          }
-      }
+         break;
+
+       case 2:
+         {
+           long x = bfd_get_32 (abfd, addr);
+           DOIT (x);
+           bfd_put_32 (abfd, (bfd_vma) x, addr);
+         }
+         break;
+
+       case 4:
+         {
+           bfd_uint64_t x = bfd_get_64 (abfd, addr);
+           DOIT (x);
+           bfd_put_64 (abfd, x, addr);
+         }
+         break;
+
+       default:
+         bfd_set_error (bfd_error_bad_value);
+         return bfd_reloc_notsupported;
+       }
+    }
 
   /* Now let bfd_perform_relocation finish everything up.  */
   return bfd_reloc_continue;
 
   /* Now let bfd_perform_relocation finish everything up.  */
   return bfd_reloc_continue;
@@ -184,15 +221,16 @@ coff_amd64_reloc (bfd *abfd,
 /* Return TRUE if this relocation should appear in the output .reloc
    section.  */
 
 /* Return TRUE if this relocation should appear in the output .reloc
    section.  */
 
-static bfd_boolean
+static bool
 in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto)
 {
 in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto)
 {
-  return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE;
+  return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE
+        && howto->type != R_AMD64_SECREL;
 }
 #endif /* COFF_WITH_PE */
 
 #ifndef PCRELOFFSET
 }
 #endif /* COFF_WITH_PE */
 
 #ifndef PCRELOFFSET
-#define PCRELOFFSET TRUE
+#define PCRELOFFSET true
 #endif
 
 static reloc_howto_type howto_table[] =
 #endif
 
 static reloc_howto_type howto_table[] =
@@ -202,53 +240,53 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long, 4 = long long) */
         64,                    /* bitsize */
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long, 4 = long long) */
         64,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "R_X86_64_64",         /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_ADDR64", /* name */
+        true,                  /* partial_inplace */
         0xffffffffffffffffll,  /* src_mask */
         0xffffffffffffffffll,  /* dst_mask */
         0xffffffffffffffffll,  /* src_mask */
         0xffffffffffffffffll,  /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        true),                 /* pcrel_offset */
   HOWTO (R_AMD64_DIR32,                /* type 2 */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
   HOWTO (R_AMD64_DIR32,                /* type 2 */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "R_X86_64_32",         /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_ADDR32", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        true),                 /* pcrel_offset */
   /* PE IMAGE_REL_AMD64_ADDR32NB relocation (3).       */
   HOWTO (R_AMD64_IMAGEBASE,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
   /* PE IMAGE_REL_AMD64_ADDR32NB relocation (3).       */
   HOWTO (R_AMD64_IMAGEBASE,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "rva32",               /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_ADDR32NB", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
   /* 32-bit longword PC relative relocation (4).  */
   HOWTO (R_AMD64_PCRLONG,      /* type 4 */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
   /* 32-bit longword PC relative relocation (4).  */
   HOWTO (R_AMD64_PCRLONG,      /* type 4 */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "R_X86_64_PC32",       /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -257,12 +295,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "DISP32+1",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32_1", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -270,12 +308,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "DISP32+2",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32_2", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -283,12 +321,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "DISP32+3",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32_3", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -296,12 +334,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "DISP32+4",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32_4", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -309,12 +347,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "DISP32+5",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_REL32_5", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -325,15 +363,15 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
-        "secrel32",            /* name */
-        TRUE,                  /* partial_inplace */
+        "IMAGE_REL_AMD64_SECREL", /* name */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        true),                 /* pcrel_offset */
 #else
   EMPTY_HOWTO (11),
 #endif
 #else
   EMPTY_HOWTO (11),
 #endif
@@ -341,18 +379,18 @@ static reloc_howto_type howto_table[] =
   EMPTY_HOWTO (13),
 #ifndef DONT_EXTEND_AMD64
   HOWTO (R_AMD64_PCRQUAD,
   EMPTY_HOWTO (13),
 #ifndef DONT_EXTEND_AMD64
   HOWTO (R_AMD64_PCRQUAD,
-         0,                     /* rightshift */
-         4,                     /* size (0 = byte, 1 = short, 2 = long) */
-         64,                    /* bitsize */
-         TRUE,                  /* pc_relative */
-         0,                     /* bitpos */
-         complain_overflow_signed, /* complain_on_overflow */
-         coff_amd64_reloc,      /* special_function */
-         "R_X86_64_PC64",       /* name */
-         TRUE,                  /* partial_inplace */
-         0xffffffffffffffffll,  /* src_mask */
-         0xffffffffffffffffll,  /* dst_mask */
-         PCRELOFFSET),           /* pcrel_offset */
+        0,                     /* rightshift */
+        4,                     /* size (0 = byte, 1 = short, 2 = long) */
+        64,                    /* bitsize */
+        true,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        coff_amd64_reloc,      /* special_function */
+        "R_X86_64_PC64",       /* name */
+        true,                  /* partial_inplace */
+        0xffffffffffffffffll,  /* src_mask */
+        0xffffffffffffffffll,  /* dst_mask */
+        PCRELOFFSET),           /* pcrel_offset */
 #else
   EMPTY_HOWTO (14),
 #endif
 #else
   EMPTY_HOWTO (14),
 #endif
@@ -361,12 +399,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_8",          /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_8",          /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x000000ff,            /* src_mask */
         0x000000ff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0x000000ff,            /* src_mask */
         0x000000ff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -375,12 +413,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_16",         /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_16",         /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x0000ffff,            /* src_mask */
         0x0000ffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0x0000ffff,            /* src_mask */
         0x0000ffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -389,12 +427,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_32S",        /* name */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_32S",        /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -403,12 +441,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC8",        /* name */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC8",        /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x000000ff,            /* src_mask */
         0x000000ff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0x000000ff,            /* src_mask */
         0x000000ff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -417,12 +455,12 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC16",       /* name */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC16",       /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x0000ffff,            /* src_mask */
         0x0000ffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
         0x0000ffff,            /* src_mask */
         0x0000ffff,            /* dst_mask */
         PCRELOFFSET),          /* pcrel_offset */
@@ -431,17 +469,19 @@ static reloc_howto_type howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC32",       /* name */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         coff_amd64_reloc,      /* special_function */
         "R_X86_64_PC32",       /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET)           /* pcrel_offset */
 };
 
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
         PCRELOFFSET)           /* pcrel_offset */
 };
 
+#define NUM_HOWTOS ARRAY_SIZE (howto_table)
+
 /* Turn a howto into a reloc  nunmber */
 
 #define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
 /* Turn a howto into a reloc  nunmber */
 
 #define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
@@ -450,7 +490,7 @@ static reloc_howto_type howto_table[] =
 
 #define RTYPE2HOWTO(cache_ptr, dst)            \
   ((cache_ptr)->howto =                                \
 
 #define RTYPE2HOWTO(cache_ptr, dst)            \
   ((cache_ptr)->howto =                                \
-   ((dst)->r_type < ARRAY_SIZE (howto_table))  \
+   ((dst)->r_type < NUM_HOWTOS)                        \
     ? howto_table + (dst)->r_type              \
     : NULL)
 
     ? howto_table + (dst)->r_type              \
     : NULL)
 
@@ -475,13 +515,13 @@ static reloc_howto_type howto_table[] =
 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)               \
   {                                                            \
     coff_symbol_type *coffsym = NULL;                          \
 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)               \
   {                                                            \
     coff_symbol_type *coffsym = NULL;                          \
-                                                               \
+                                                               \
     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                  \
       coffsym = (obj_symbols (abfd)                            \
     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                  \
       coffsym = (obj_symbols (abfd)                            \
-                + (cache_ptr->sym_ptr_ptr - symbols));         \
+                + (cache_ptr->sym_ptr_ptr - symbols));         \
     else if (ptr)                                              \
     else if (ptr)                                              \
-      coffsym = coff_symbol_from (abfd, ptr);                  \
-                                                               \
+      coffsym = coff_symbol_from (ptr);                                \
+                                                               \
     if (coffsym != NULL                                                \
        && coffsym->native->u.syment.n_scnum == 0)              \
       cache_ptr->addend = - coffsym->native->u.syment.n_value; \
     if (coffsym != NULL                                                \
        && coffsym->native->u.syment.n_scnum == 0)              \
       cache_ptr->addend = - coffsym->native->u.syment.n_value; \
@@ -490,7 +530,8 @@ static reloc_howto_type howto_table[] =
       cache_ptr->addend = - (ptr->section->vma + ptr->value);  \
     else                                                       \
       cache_ptr->addend = 0;                                   \
       cache_ptr->addend = - (ptr->section->vma + ptr->value);  \
     else                                                       \
       cache_ptr->addend = 0;                                   \
-    if (ptr && howto_table[reloc.r_type].pc_relative)          \
+    if (ptr && reloc.r_type < NUM_HOWTOS                       \
+       && howto_table[reloc.r_type].pc_relative)               \
       cache_ptr->addend += asect->vma;                         \
   }
 
       cache_ptr->addend += asect->vma;                         \
   }
 
@@ -508,7 +549,7 @@ static reloc_howto_type howto_table[] =
    and the regular routine is that we don't want to do anything for a
    relocatable link.  */
 
    and the regular routine is that we don't want to do anything for a
    relocatable link.  */
 
-static bfd_boolean
+static bool
 coff_pe_amd64_relocate_section (bfd *output_bfd,
                                struct bfd_link_info *info,
                                bfd *input_bfd,
 coff_pe_amd64_relocate_section (bfd *output_bfd,
                                struct bfd_link_info *info,
                                bfd *input_bfd,
@@ -518,8 +559,8 @@ coff_pe_amd64_relocate_section (bfd *output_bfd,
                                struct internal_syment *syms,
                                asection **sections)
 {
                                struct internal_syment *syms,
                                asection **sections)
 {
-  if (info->relocatable)
-    return TRUE;
+  if (bfd_link_relocatable (info))
+    return true;
 
   return _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,input_section, contents,relocs, syms, sections);
 }
 
   return _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,input_section, contents,relocs, syms, sections);
 }
@@ -540,21 +581,21 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
 {
   reloc_howto_type *howto;
 
 {
   reloc_howto_type *howto;
 
-  if (rel->r_type > ARRAY_SIZE (howto_table))
+  if (rel->r_type >= NUM_HOWTOS)
     {
       bfd_set_error (bfd_error_bad_value);
       return NULL;
     }
     {
       bfd_set_error (bfd_error_bad_value);
       return NULL;
     }
-  if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5)
-    {
-      rel->r_vaddr += (bfd_vma)(rel->r_type-R_AMD64_PCRLONG);
-      rel->r_type = R_AMD64_PCRLONG;
-    }
   howto = howto_table + rel->r_type;
 
 #if defined(COFF_WITH_PE)
   /* Cancel out code in _bfd_coff_generic_relocate_section.  */
   *addendp = 0;
   howto = howto_table + rel->r_type;
 
 #if defined(COFF_WITH_PE)
   /* Cancel out code in _bfd_coff_generic_relocate_section.  */
   *addendp = 0;
+  if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5)
+    {
+      *addendp -= (bfd_vma)(rel->r_type - R_AMD64_PCRLONG);
+      rel->r_type = R_AMD64_PCRLONG;
+    }
 #endif
 
   if (howto->pc_relative)
 #endif
 
   if (howto->pc_relative)
@@ -592,14 +633,19 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
 #if defined(COFF_WITH_PE)
   if (howto->pc_relative)
     {
 #if defined(COFF_WITH_PE)
   if (howto->pc_relative)
     {
-      *addendp -= 4;
+#ifndef DONT_EXTEND_AMD64
+      if (rel->r_type == R_AMD64_PCRQUAD)
+       *addendp -= 8;
+      else
+#endif
+       *addendp -= 4;
 
       /* If the symbol is defined, then the generic code is going to
 
       /* If the symbol is defined, then the generic code is going to
-         add back the symbol value in order to cancel out an
-         adjustment it made to the addend.  However, we set the addend
-         to 0 at the start of this function.  We need to adjust here,
-         to avoid the adjustment the generic code will make.  FIXME:
-         This is getting a bit hackish.  */
+        add back the symbol value in order to cancel out an
+        adjustment it made to the addend.  However, we set the addend
+        to 0 at the start of this function.  We need to adjust here,
+        to avoid the adjustment the generic code will make.  FIXME:
+        This is getting a bit hackish.  */
       if (sym != NULL && sym->n_scnum != 0)
        *addendp -= sym->n_value;
     }
       if (sym != NULL && sym->n_scnum != 0)
        *addendp -= sym->n_value;
     }
@@ -612,19 +658,20 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
     {
       bfd_vma osect_vma;
 
     {
       bfd_vma osect_vma;
 
-      if (h && (h->type == bfd_link_hash_defined || h->type == bfd_link_hash_defweak))
+      if (h && (h->root.type == bfd_link_hash_defined
+               || h->root.type == bfd_link_hash_defweak))
        osect_vma = h->root.u.def.section->output_section->vma;
       else
        {
        osect_vma = h->root.u.def.section->output_section->vma;
       else
        {
-         asection *sec;
+         asection *s;
          int i;
 
          /* Sigh, the only way to get the section to offset against
             is to find it the hard way.  */
          int i;
 
          /* Sigh, the only way to get the section to offset against
             is to find it the hard way.  */
-         for (sec = abfd->sections, i = 1; i < sym->n_scnum; i++)
-           sec = sec->next;
+         for (s = abfd->sections, i = 1; i < sym->n_scnum; i++)
+           s = s->next;
 
 
-         osect_vma = sec->output_section->vma;
+         osect_vma = s->output_section->vma;
        }
 
       *addendp -= osect_vma;
        }
 
       *addendp -= osect_vma;
@@ -682,7 +729,7 @@ coff_amd64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 {
   unsigned int i;
 
 {
   unsigned int i;
 
-  for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++)
+  for (i = 0; i < NUM_HOWTOS; i++)
     if (howto_table[i].name != NULL
        && strcasecmp (howto_table[i].name, r_name) == 0)
       return &howto_table[i];
     if (howto_table[i].name != NULL
        && strcasecmp (howto_table[i].name, r_name) == 0)
       return &howto_table[i];
@@ -698,11 +745,11 @@ coff_amd64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    a leading dot for local labels, so if TARGET_UNDERSCORE is defined
    we treat all symbols starting with L as local.  */
 
    a leading dot for local labels, so if TARGET_UNDERSCORE is defined
    we treat all symbols starting with L as local.  */
 
-static bfd_boolean
+static bool
 coff_amd64_is_local_label_name (bfd *abfd, const char *name)
 {
   if (name[0] == 'L')
 coff_amd64_is_local_label_name (bfd *abfd, const char *name)
 {
   if (name[0] == 'L')
-    return TRUE;
+    return true;
 
   return _bfd_coff_is_local_label_name (abfd, name);
 }
 
   return _bfd_coff_is_local_label_name (abfd, name);
 }
@@ -711,14 +758,9 @@ coff_amd64_is_local_label_name (bfd *abfd, const char *name)
 
 #endif /* TARGET_UNDERSCORE */
 
 
 #endif /* TARGET_UNDERSCORE */
 
-#ifdef PE
-#undef  bfd_pe_print_pdata
-#define bfd_pe_print_pdata   _bfd_pex64_print_pdata
-#else  /* PE */
 #ifndef bfd_pe_print_pdata
 #define bfd_pe_print_pdata   NULL
 #endif
 #ifndef bfd_pe_print_pdata
 #define bfd_pe_print_pdata   NULL
 #endif
-#endif /* PE */
 
 #include "coffcode.h"
 
 
 #include "coffcode.h"
 
@@ -732,7 +774,7 @@ const bfd_target
 #ifdef TARGET_SYM
   TARGET_SYM =
 #else
 #ifdef TARGET_SYM
   TARGET_SYM =
 #else
-  x86_64coff_vec =
+  x86_64_coff_vec =
 #endif
 {
 #ifdef TARGET_NAME
 #endif
 {
 #ifdef TARGET_NAME
@@ -744,15 +786,15 @@ const bfd_target
   BFD_ENDIAN_LITTLE,           /* Data byte order is little.  */
   BFD_ENDIAN_LITTLE,           /* Header byte order is little.  */
 
   BFD_ENDIAN_LITTLE,           /* Data byte order is little.  */
   BFD_ENDIAN_LITTLE,           /* Header byte order is little.  */
 
-  (HAS_RELOC | EXEC_P |                /* Object flags.  */
-   HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
+  (HAS_RELOC | EXEC_P          /* Object flags.  */
+   | HAS_LINENO | HAS_DEBUG
+   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
 
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags.  */
 #if defined(COFF_WITH_PE)
 
   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags.  */
 #if defined(COFF_WITH_PE)
-   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY
+   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
 #endif
 #endif
-   | SEC_CODE | SEC_DATA),
+   | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
 
 #ifdef TARGET_UNDERSCORE
   TARGET_UNDERSCORE,           /* Leading underscore.  */
 
 #ifdef TARGET_UNDERSCORE
   TARGET_UNDERSCORE,           /* Leading underscore.  */
@@ -761,6 +803,8 @@ const bfd_target
 #endif
   '/',                         /* Ar_pad_char.  */
   15,                          /* Ar_max_namelen.  */
 #endif
   '/',                         /* Ar_pad_char.  */
   15,                          /* Ar_max_namelen.  */
+  0,                           /* match priority.  */
+  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
@@ -770,12 +814,24 @@ const bfd_target
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */
 
   /* Note that we allow an object file to be treated as a core file as well.  */
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */
 
   /* Note that we allow an object file to be treated as a core file as well.  */
-  { _bfd_dummy_target, amd64coff_object_p, /* BFD_check_format.  */
-    bfd_generic_archive_p, amd64coff_object_p },
-  { bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format.  */
-    bfd_false },
-  { bfd_false, coff_write_object_contents, /* bfd_write_contents.  */
-   _bfd_write_archive_contents, bfd_false },
+  {                            /* bfd_check_format.  */
+    _bfd_dummy_target,
+    amd64coff_object_p,
+    bfd_generic_archive_p,
+    amd64coff_object_p
+  },
+  {                            /* bfd_set_format.  */
+    _bfd_bool_bfd_false_error,
+    coff_mkobject,
+    _bfd_generic_mkarchive,
+    _bfd_bool_bfd_false_error
+  },
+  {                            /* bfd_write_contents.  */
+    _bfd_bool_bfd_false_error,
+    coff_write_object_contents,
+    _bfd_write_archive_contents,
+    _bfd_bool_bfd_false_error
+  },
 
   BFD_JUMP_TABLE_GENERIC (coff),
   BFD_JUMP_TABLE_COPY (coff),
 
   BFD_JUMP_TABLE_GENERIC (coff),
   BFD_JUMP_TABLE_COPY (coff),
@@ -791,3 +847,77 @@ const bfd_target
 
   COFF_SWAP_TABLE
 };
 
   COFF_SWAP_TABLE
 };
+
+/* Entry for big object files.  */
+
+#ifdef COFF_WITH_PE_BIGOBJ
+const bfd_target
+  TARGET_SYM_BIG =
+{
+  TARGET_NAME_BIG,
+  bfd_target_coff_flavour,
+  BFD_ENDIAN_LITTLE,           /* Data byte order is little.  */
+  BFD_ENDIAN_LITTLE,           /* Header byte order is little.  */
+
+  (HAS_RELOC | EXEC_P          /* Object flags.  */
+   | HAS_LINENO | HAS_DEBUG
+   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
+
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags.  */
+#if defined(COFF_WITH_PE)
+   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
+#endif
+   | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
+
+#ifdef TARGET_UNDERSCORE
+  TARGET_UNDERSCORE,           /* Leading underscore.  */
+#else
+  0,                           /* Leading underscore.  */
+#endif
+  '/',                         /* Ar_pad_char.  */
+  15,                          /* Ar_max_namelen.  */
+  0,                           /* match priority.  */
+  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+
+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */
+
+  /* Note that we allow an object file to be treated as a core file as well.  */
+  {                            /* bfd_check_format.  */
+    _bfd_dummy_target,
+    amd64coff_object_p,
+    bfd_generic_archive_p,
+    amd64coff_object_p
+  },
+  {                            /* bfd_set_format.  */
+    _bfd_bool_bfd_false_error,
+    coff_mkobject,
+    _bfd_generic_mkarchive,
+    _bfd_bool_bfd_false_error
+  },
+  {                            /* bfd_write_contents.  */
+    _bfd_bool_bfd_false_error,
+    coff_write_object_contents,
+    _bfd_write_archive_contents,
+    _bfd_bool_bfd_false_error
+  },
+
+  BFD_JUMP_TABLE_GENERIC (coff),
+  BFD_JUMP_TABLE_COPY (coff),
+  BFD_JUMP_TABLE_CORE (_bfd_nocore),
+  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
+  BFD_JUMP_TABLE_SYMBOLS (coff),
+  BFD_JUMP_TABLE_RELOCS (coff),
+  BFD_JUMP_TABLE_WRITE (coff),
+  BFD_JUMP_TABLE_LINK (coff),
+  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+
+  NULL,
+
+  &bigobj_swap_table
+};
+#endif