OSDN Git Service

gdb/testsuite/
[pf3gnuchains/pf3gnuchains3x.git] / bfd / coff-alpha.c
index 5c02c3a..ce217f5 100644 (file)
@@ -1,27 +1,28 @@
 /* BFD back-end for ALPHA Extended-Coff files.
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+   2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
    Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
    Ian Lance Taylor <ian@cygnus.com>.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
 #include "coff/internal.h"
@@ -35,36 +36,40 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 \f
 /* Prototypes for static functions.  */
 
-static const bfd_target *alpha_ecoff_object_p PARAMS ((bfd *));
-static boolean alpha_ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr));
-static PTR alpha_ecoff_mkobject_hook PARAMS ((bfd *, PTR filehdr, PTR aouthdr));
-static void alpha_ecoff_swap_reloc_in PARAMS ((bfd *, PTR,
-                                             struct internal_reloc *));
-static void alpha_ecoff_swap_reloc_out PARAMS ((bfd *,
-                                              const struct internal_reloc *,
-                                              PTR));
-static void alpha_adjust_reloc_in PARAMS ((bfd *,
-                                          const struct internal_reloc *,
-                                          arelent *));
-static void alpha_adjust_reloc_out PARAMS ((bfd *, const arelent *,
-                                           struct internal_reloc *));
+static const bfd_target *alpha_ecoff_object_p
+  PARAMS ((bfd *));
+static bfd_boolean alpha_ecoff_bad_format_hook
+  PARAMS ((bfd *abfd, PTR filehdr));
+static PTR alpha_ecoff_mkobject_hook
+  PARAMS ((bfd *, PTR filehdr, PTR aouthdr));
+static void alpha_ecoff_swap_reloc_in
+  PARAMS ((bfd *, PTR, struct internal_reloc *));
+static void alpha_ecoff_swap_reloc_out
+  PARAMS ((bfd *, const struct internal_reloc *, PTR));
+static void alpha_adjust_reloc_in
+  PARAMS ((bfd *, const struct internal_reloc *, arelent *));
+static void alpha_adjust_reloc_out
+  PARAMS ((bfd *, const arelent *, struct internal_reloc *));
 static reloc_howto_type *alpha_bfd_reloc_type_lookup
- PARAMS ((bfd *, bfd_reloc_code_real_type));
 PARAMS ((bfd *, bfd_reloc_code_real_type));
 static bfd_byte *alpha_ecoff_get_relocated_section_contents
   PARAMS ((bfd *abfd, struct bfd_link_info *, struct bfd_link_order *,
-          bfd_byte *data, boolean relocateable, asymbol **symbols));
+          bfd_byte *data, bfd_boolean relocatable, asymbol **symbols));
 static bfd_vma alpha_convert_external_reloc
   PARAMS ((bfd *, struct bfd_link_info *, bfd *, struct external_reloc *,
           struct ecoff_link_hash_entry *));
-static boolean alpha_relocate_section PARAMS ((bfd *, struct bfd_link_info *,
-                                              bfd *, asection *,
-                                              bfd_byte *, PTR));
-static boolean alpha_adjust_headers
+static bfd_boolean alpha_relocate_section
+  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, PTR));
+static bfd_boolean alpha_adjust_headers
   PARAMS ((bfd *, struct internal_filehdr *, struct internal_aouthdr *));
-static PTR alpha_ecoff_read_ar_hdr PARAMS ((bfd *));
-static bfd *alpha_ecoff_get_elt_at_filepos PARAMS ((bfd *, file_ptr));
-static bfd *alpha_ecoff_openr_next_archived_file PARAMS ((bfd *, bfd *));
-static bfd *alpha_ecoff_get_elt_at_index PARAMS ((bfd *, symindex));
+static PTR alpha_ecoff_read_ar_hdr
+  PARAMS ((bfd *));
+static bfd *alpha_ecoff_get_elt_at_filepos
+  PARAMS ((bfd *, file_ptr));
+static bfd *alpha_ecoff_openr_next_archived_file
+  PARAMS ((bfd *, bfd *));
+static bfd *alpha_ecoff_get_elt_at_index
+  PARAMS ((bfd *, symindex));
 \f
 /* ECOFF has COFF sections, but the debugging information is stored in
    a completely different format.  ECOFF targets use some of the
@@ -122,9 +127,8 @@ static bfd *alpha_ecoff_get_elt_at_index PARAMS ((bfd *, symindex));
 \f
 /* How to process the various reloc types.  */
 
-static bfd_reloc_status_type
-reloc_nil PARAMS ((bfd *, arelent *, asymbol *, PTR,
-                  asection *, bfd *, char **));
+static bfd_reloc_status_type reloc_nil
+  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
 
 static bfd_reloc_status_type
 reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message)
@@ -152,45 +156,45 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "IGNORE",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A 32 bit reference to a symbol.  */
   HOWTO (ALPHA_R_REFLONG,      /* 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 */
         0,                     /* special_function */
         "REFLONG",             /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 64 bit reference to a symbol.  */
   HOWTO (ALPHA_R_REFQUAD,      /* type */
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "REFQUAD",             /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         MINUS_ONE,             /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 32 bit GP relative offset.  This is just like REFLONG except
      that when the value is used the value of the gp register will be
@@ -199,15 +203,15 @@ static reloc_howto_type alpha_howto_table[] =
         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 */
         0,                     /* special_function */
         "GPREL32",             /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Used for an instruction that refers to memory off the GP
      register.  The offset is 16 bits of the 32 bit instruction.  This
@@ -216,15 +220,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "LITERAL",             /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* This reloc only appears immediately following a LITERAL reloc.
      It identifies a use of the literal.  It seems that the linker can
@@ -239,15 +243,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "LITUSE",              /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Load the gp register.  This is always used for a ldah instruction
      which loads the upper 16 bits of the gp register.  The next reloc
@@ -264,15 +268,15 @@ static reloc_howto_type alpha_howto_table[] =
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "GPDISP",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        true),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   /* A 21 bit branch.  The native assembler generates these for
      branches within the text segment, and also fills in the PC
@@ -281,90 +285,90 @@ static reloc_howto_type alpha_howto_table[] =
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         21,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "BRADDR",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0x1fffff,              /* src_mask */
         0x1fffff,              /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A hint for a jump to a register.  */
   HOWTO (ALPHA_R_HINT,         /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         14,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "HINT",                /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0x3fff,                /* src_mask */
         0x3fff,                /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* 16 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL16,       /* type */
         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 */
         0,                     /* special_function */
         "SREL16",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* 32 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL32,       /* type */
         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 */
         0,                     /* special_function */
         "SREL32",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* A 64 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL64,       /* type */
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        true,                  /* pc_relative */
+        TRUE,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "SREL64",              /* name */
-        true,                  /* partial_inplace */
+        TRUE,                  /* partial_inplace */
         MINUS_ONE,             /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Push a value on the reloc evaluation stack.  */
   HOWTO (ALPHA_R_OP_PUSH,      /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PUSH",             /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Store the value from the stack at the given address.  Store it in
      a bitfield of size r_size starting at bit position r_offset.  */
@@ -372,15 +376,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_STORE",            /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Subtract the reloc address from the value on the top of the
      relocation stack.  */
@@ -388,15 +392,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PSUB",             /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Shift the value on the top of the relocation stack right by the
      given value.  */
@@ -404,30 +408,30 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PRSHIFT",          /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false),                /* pcrel_offset */
+        FALSE),                /* pcrel_offset */
 
   /* Adjust the GP value for a new range in the object file.  */
   HOWTO (ALPHA_R_GPVALUE,      /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        false,                 /* pc_relative */
+        FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "GPVALUE",             /* name */
-        false,                 /* partial_inplace */
+        FALSE,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        false)                 /* pcrel_offset */
+        FALSE)                 /* pcrel_offset */
 };
 \f
 /* Recognize an Alpha ECOFF file.  */
@@ -459,8 +463,8 @@ alpha_ecoff_object_p (abfd)
          bfd_size_type size;
 
          size = sec->line_filepos * 8;
-         BFD_ASSERT (size == bfd_section_size (abfd, sec)
-                     || size + 8 == bfd_section_size (abfd, sec));
+         BFD_ASSERT (size == sec->size
+                     || size + 8 == sec->size);
          if (! bfd_set_section_size (abfd, sec, size))
            return NULL;
        }
@@ -471,17 +475,23 @@ alpha_ecoff_object_p (abfd)
 
 /* See whether the magic number matches.  */
 
-static boolean
+static bfd_boolean
 alpha_ecoff_bad_format_hook (abfd, filehdr)
      bfd *abfd ATTRIBUTE_UNUSED;
      PTR filehdr;
 {
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
 
-  if (ALPHA_ECOFF_BADMAG (*internal_f))
-    return false;
+  if (ALPHA_ECOFF_BADMAG (*internal_f))
+    return TRUE;
 
-  return true;
+  if (ALPHA_ECOFF_COMPRESSEDMAG (*internal_f))
+    (*_bfd_error_handler)
+      (_("%B: Cannot handle compressed Alpha binaries.\n"
+        "   Use compiler flags, or objZ, to generate uncompressed binaries."),
+       abfd);
+
+  return FALSE;
 }
 
 /* This is a hook called by coff_real_object_p to create any backend
@@ -600,8 +610,11 @@ alpha_ecoff_swap_reloc_out (abfd, intern, dst)
       size = intern->r_size;
     }
 
+  /* XXX FIXME:  The maximum symndx value used to be 14 but this
+     fails with object files produced by DEC's C++ compiler.
+     Where does the value 14 (or 15) come from anyway ?  */
   BFD_ASSERT (intern->r_extern
-             || (intern->r_symndx >= 0 && intern->r_symndx <= 14));
+             || (intern->r_symndx >= 0 && intern->r_symndx <= 15));
 
   H_PUT_64 (abfd, intern->r_vaddr, ext->r_vaddr);
   H_PUT_32 (abfd, symndx, ext->r_symndx);
@@ -629,7 +642,15 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
      arelent *rptr;
 {
   if (intern->r_type > ALPHA_R_GPVALUE)
-    abort ();
+    {
+      (*_bfd_error_handler)
+       (_("%B: unknown/unsupported relocation type %d"),
+        abfd, intern->r_type);
+      bfd_set_error (bfd_error_bad_value);
+      rptr->addend = 0;
+      rptr->howto  = NULL;
+      return;
+    }
 
   switch (intern->r_type)
     {
@@ -665,7 +686,7 @@ alpha_adjust_reloc_in (abfd, intern, rptr)
     case ALPHA_R_OP_STORE:
       /* The STORE reloc needs the size and offset fields.  We store
         them in the addend.  */
-      BFD_ASSERT (intern->r_offset <= 256 && intern->r_size <= 256);
+      BFD_ASSERT (intern->r_offset <= 256);
       rptr->addend = (intern->r_offset << 8) + intern->r_size;
       break;
 
@@ -750,12 +771,12 @@ alpha_adjust_reloc_out (abfd, rel, intern)
 
 static bfd_byte *
 alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
-                                           data, relocateable, symbols)
+                                           data, relocatable, symbols)
      bfd *abfd;
      struct bfd_link_info *link_info;
      struct bfd_link_order *link_order;
      bfd_byte *data;
-     boolean relocateable;
+     bfd_boolean relocatable;
      asymbol **symbols;
 {
   bfd *input_bfd = link_order->u.indirect.section->owner;
@@ -763,9 +784,10 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
   long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
   arelent **reloc_vector = NULL;
   long reloc_count;
-  bfd *output_bfd = relocateable ? abfd : (bfd *) NULL;
+  bfd *output_bfd = relocatable ? abfd : (bfd *) NULL;
   bfd_vma gp;
-  boolean gp_undefined;
+  bfd_size_type sz;
+  bfd_boolean gp_undefined;
   bfd_vma stack[RELOC_STACKSIZE];
   int tos = 0;
 
@@ -775,14 +797,10 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
   if (reloc_vector == NULL && reloc_size != 0)
     goto error_return;
 
-  if (! bfd_get_section_contents (input_bfd, input_section, data,
-                                 (file_ptr) 0, input_section->_raw_size))
+  sz = input_section->rawsize ? input_section->rawsize : input_section->size;
+  if (! bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
     goto error_return;
 
-  /* The section size is not going to change.  */
-  input_section->_cooked_size = input_section->_raw_size;
-  input_section->reloc_done = true;
-
   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
                                        reloc_vector, symbols);
   if (reloc_count < 0)
@@ -791,11 +809,11 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
     goto successful_return;
 
   /* Get the GP value for the output BFD.  */
-  gp_undefined = false;
+  gp_undefined = FALSE;
   gp = _bfd_get_gp_value (abfd);
   if (gp == 0)
     {
-      if (relocateable != false)
+      if (relocatable)
        {
          asection *sec;
          bfd_vma lo;
@@ -819,11 +837,11 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
        {
          struct bfd_link_hash_entry *h;
 
-         h = bfd_link_hash_lookup (link_info->hash, "_gp", false, false,
-                                   true);
+         h = bfd_link_hash_lookup (link_info->hash, "_gp", FALSE, FALSE,
+                                   TRUE);
          if (h == (struct bfd_link_hash_entry *) NULL
              || h->type != bfd_link_hash_defined)
-           gp_undefined = true;
+           gp_undefined = TRUE;
          else
            {
              gp = (h->u.def.value
@@ -855,7 +873,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
        case ALPHA_R_SREL16:
        case ALPHA_R_SREL32:
        case ALPHA_R_SREL64:
-         if (relocateable
+         if (relocatable
              && ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
            {
              rel->address += input_section->output_offset;
@@ -988,7 +1006,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            asymbol *symbol;
            bfd_vma relocation;
 
-           if (relocateable)
+           if (relocatable)
              {
                rel->address += input_section->output_offset;
                break;
@@ -1021,7 +1039,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            bfd_vma val;
            int offset, size;
 
-           if (relocateable)
+           if (relocatable)
              {
                rel->address += input_section->output_offset;
                break;
@@ -1048,7 +1066,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            asymbol *symbol;
            bfd_vma relocation;
 
-           if (relocateable)
+           if (relocatable)
              {
                rel->address += input_section->output_offset;
                break;
@@ -1081,7 +1099,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            asymbol *symbol;
            bfd_vma relocation;
 
-           if (relocateable)
+           if (relocatable)
              {
                rel->address += input_section->output_offset;
                break;
@@ -1111,14 +1129,14 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
        case ALPHA_R_GPVALUE:
          /* I really don't know if this does the right thing.  */
          gp = rel->addend;
-         gp_undefined = false;
+         gp_undefined = FALSE;
          break;
 
        default:
          abort ();
        }
 
-      if (relocateable)
+      if (relocatable)
        {
          asection *os = input_section->output_section;
 
@@ -1134,7 +1152,7 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
            case bfd_reloc_undefined:
              if (! ((*link_info->callbacks->undefined_symbol)
                     (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
-                     input_bfd, input_section, rel->address, true)))
+                     input_bfd, input_section, rel->address, TRUE)))
                goto error_return;
              break;
            case bfd_reloc_dangerous:
@@ -1145,7 +1163,8 @@ alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order,
              break;
            case bfd_reloc_overflow:
              if (! ((*link_info->callbacks->reloc_overflow)
-                    (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
+                    (link_info, NULL,
+                     bfd_asymbol_name (*rel->sym_ptr_ptr),
                      rel->howto->name, rel->addend, input_bfd,
                      input_section, rel->address)))
                goto error_return;
@@ -1220,32 +1239,31 @@ alpha_bfd_reloc_type_lookup (abfd, code)
     case BFD_RELOC_64_PCREL:
       alpha_type = ALPHA_R_SREL64;
       break;
-#if 0
-    case ???:
-      alpha_type = ALPHA_R_OP_PUSH;
-      break;
-    case ???:
-      alpha_type = ALPHA_R_OP_STORE;
-      break;
-    case ???:
-      alpha_type = ALPHA_R_OP_PSUB;
-      break;
-    case ???:
-      alpha_type = ALPHA_R_OP_PRSHIFT;
-      break;
-    case ???:
-      alpha_type = ALPHA_R_GPVALUE;
-      break;
-#endif
     default:
       return (reloc_howto_type *) NULL;
     }
 
   return &alpha_howto_table[alpha_type];
 }
+
+static reloc_howto_type *
+alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
+       i++)
+    if (alpha_howto_table[i].name != NULL
+       && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
+      return &alpha_howto_table[i];
+
+  return NULL;
+}
 \f
 /* A helper routine for alpha_relocate_section which converts an
-   external reloc when generating relocateable output.  Returns the
+   external reloc when generating relocatable output.  Returns the
    relocation amount.  */
 
 static bfd_vma
@@ -1259,7 +1277,7 @@ alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
   unsigned long r_symndx;
   bfd_vma relocation;
 
-  BFD_ASSERT (info->relocateable);
+  BFD_ASSERT (info->relocatable);
 
   if (h->root.type == bfd_link_hash_defined
       || h->root.type == bfd_link_hash_defweak)
@@ -1365,7 +1383,7 @@ alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h)
    quite similar to get_relocated_section_contents.  Perhaps they
    could be combined somehow.  */
 
-static boolean
+static bfd_boolean
 alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                        contents, external_relocs)
      bfd *output_bfd;
@@ -1378,7 +1396,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
   asection **symndx_to_section, *lita_sec;
   struct ecoff_link_hash_entry **sym_hashes;
   bfd_vma gp;
-  boolean gp_undefined;
+  bfd_boolean gp_undefined;
   bfd_vma stack[RELOC_STACKSIZE];
   int tos = 0;
   struct external_reloc *ext_rel;
@@ -1394,7 +1412,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
       amt = NUM_RELOC_SECTIONS * sizeof (asection *);
       symndx_to_section = (asection **) bfd_alloc (input_bfd, amt);
       if (!symndx_to_section)
-       return false;
+       return FALSE;
 
       symndx_to_section[RELOC_SECTION_NONE] = NULL;
       symndx_to_section[RELOC_SECTION_TEXT] =
@@ -1440,7 +1458,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
   gp = _bfd_get_gp_value (output_bfd);
-  if (! info->relocateable && lita_sec != NULL)
+  if (! info->relocatable && lita_sec != NULL)
     {
       struct ecoff_section_tdata *lita_sec_data;
 
@@ -1452,7 +1470,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          amt = sizeof (struct ecoff_section_tdata);
          lita_sec_data = ((struct ecoff_section_tdata *)
                           bfd_zalloc (input_bfd, amt));
-         ecoff_section_data (input_bfd, lita_sec) = lita_sec_data;
+         lita_sec->used_by_bfd = lita_sec_data;
        }
 
       if (lita_sec_data->gp != 0)
@@ -1467,9 +1485,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          bfd_size_type lita_size;
 
          lita_vma = lita_sec->output_offset + lita_sec->output_section->vma;
-         lita_size = lita_sec->_cooked_size;
-         if (lita_size == 0)
-           lita_size = lita_sec->_raw_size;
+         lita_size = lita_sec->size;
 
          if (gp == 0
              || lita_vma <  gp - 0x8000
@@ -1485,7 +1501,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                                               _("using multiple gp values"),
                                               (char *) NULL, output_bfd,
                                               (asection *) NULL, (bfd_vma) 0);
-                 ecoff_data (output_bfd)->issued_multiple_gp_warning = true;
+                 ecoff_data (output_bfd)->issued_multiple_gp_warning = TRUE;
                }
              if (lita_vma < gp - 0x8000)
                gp = lita_vma + lita_size - 0x8000;
@@ -1515,9 +1531,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
       int r_extern;
       int r_offset;
       int r_size;
-      boolean relocatep;
-      boolean adjust_addrp;
-      boolean gp_usedp;
+      bfd_boolean relocatep;
+      bfd_boolean adjust_addrp;
+      bfd_boolean gp_usedp;
       bfd_vma addend;
 
       r_vaddr = H_GET_64 (input_bfd, ext_rel->r_vaddr);
@@ -1532,15 +1548,33 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
       r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
                >> RELOC_BITS3_SIZE_SH_LITTLE);
 
-      relocatep = false;
-      adjust_addrp = true;
-      gp_usedp = false;
+      relocatep = FALSE;
+      adjust_addrp = TRUE;
+      gp_usedp = FALSE;
       addend = 0;
 
       switch (r_type)
        {
+       case ALPHA_R_GPRELHIGH:
+         (*_bfd_error_handler)
+           (_("%B: unsupported relocation: ALPHA_R_GPRELHIGH"),
+            input_bfd);
+         bfd_set_error (bfd_error_bad_value);
+         continue;
+         
+       case ALPHA_R_GPRELLOW:
+         (*_bfd_error_handler)
+           (_("%B: unsupported relocation: ALPHA_R_GPRELLOW"),
+            input_bfd);
+         bfd_set_error (bfd_error_bad_value);
+         continue;
+         
        default:
-         abort ();
+         (*_bfd_error_handler)
+           (_("%B: unknown relocation type %d"),
+            input_bfd, (int) r_type);
+         bfd_set_error (bfd_error_bad_value);
+         continue;
 
        case ALPHA_R_IGNORE:
          /* This reloc appears after a GPDISP reloc.  On earlier
@@ -1549,16 +1583,16 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
             not otherwise used for anything.  For some reason, the
             address of the relocation does not appear to include the
             section VMA, unlike the other relocation types.  */
-         if (info->relocateable)
+         if (info->relocatable)
            H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
                      ext_rel->r_vaddr);
-         adjust_addrp = false;
+         adjust_addrp = FALSE;
          break;
 
        case ALPHA_R_REFLONG:
        case ALPHA_R_REFQUAD:
        case ALPHA_R_HINT:
-         relocatep = true;
+         relocatep = TRUE;
          break;
 
        case ALPHA_R_BRADDR:
@@ -1567,7 +1601,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
        case ALPHA_R_SREL64:
          if (r_extern)
            addend += - (r_vaddr + 4);
-         relocatep = true;
+         relocatep = TRUE;
          break;
 
        case ALPHA_R_GPREL32:
@@ -1575,9 +1609,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
             bit offset from the current GP value.  We must adjust it
             by the different between the original GP value and the
             current GP value.  */
-         relocatep = true;
+         relocatep = TRUE;
          addend = ecoff_data (input_bfd)->gp - gp;
-         gp_usedp = true;
+         gp_usedp = TRUE;
          break;
 
        case ALPHA_R_LITERAL:
@@ -1608,9 +1642,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                        || ((insn >> 26) & 0x3f) == 0x28);
          }
 
-         relocatep = true;
+         relocatep = TRUE;
          addend = ecoff_data (input_bfd)->gp - gp;
-         gp_usedp = true;
+         gp_usedp = TRUE;
          break;
 
        case ALPHA_R_LITUSE:
@@ -1674,7 +1708,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
            bfd_put_32 (input_bfd, (bfd_vma) insn2,
                        contents + r_vaddr - input_section->vma + r_symndx);
 
-           gp_usedp = true;
+           gp_usedp = TRUE;
          }
          break;
 
@@ -1702,7 +1736,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
              if (h == (struct ecoff_link_hash_entry *) NULL)
                abort ();
 
-             if (! info->relocateable)
+             if (! info->relocatable)
                {
                  if (h->root.type == bfd_link_hash_defined
                      || h->root.type == bfd_link_hash_defweak)
@@ -1717,8 +1751,8 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                         relocated.  */
                      if (! ((*info->callbacks->undefined_symbol)
                             (info, h->root.root.string, input_bfd,
-                             input_section, (bfd_vma) 0, true)))
-                       return false;
+                             input_section, (bfd_vma) 0, TRUE)))
+                       return FALSE;
                      addend = 0;
                    }
                }
@@ -1734,7 +1768,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      if (! ((*info->callbacks->unattached_reloc)
                             (info, h->root.root.string, input_bfd,
                              input_section, (bfd_vma) 0)))
-                       return false;
+                       return FALSE;
                    }
 
                  addend = alpha_convert_external_reloc (output_bfd, info,
@@ -1745,7 +1779,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
 
          addend += r_vaddr;
 
-         if (info->relocateable)
+         if (info->relocatable)
            {
              /* Adjust r_vaddr by the addend.  */
              H_PUT_64 (input_bfd, addend, ext_rel->r_vaddr);
@@ -1774,14 +1808,14 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                }
            }
 
-         adjust_addrp = false;
+         adjust_addrp = FALSE;
          break;
 
        case ALPHA_R_OP_STORE:
          /* Store a value from the reloc stack into a bitfield.  If
-            we are generating relocateable output, all we do is
+            we are generating relocatable output, all we do is
             adjust the address of the reloc.  */
-         if (! info->relocateable)
+         if (! info->relocatable)
            {
              bfd_vma mask;
              bfd_vma val;
@@ -1811,7 +1845,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
        case ALPHA_R_GPVALUE:
          /* I really don't know if this does the right thing.  */
          gp = ecoff_data (input_bfd)->gp + r_symndx;
-         gp_undefined = false;
+         gp_undefined = FALSE;
          break;
        }
 
@@ -1847,9 +1881,9 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                abort ();
            }
 
-         if (info->relocateable)
+         if (info->relocatable)
            {
-             /* We are generating relocateable output, and must
+             /* We are generating relocatable output, and must
                 convert the existing reloc.  */
              if (r_extern)
                {
@@ -1861,7 +1895,7 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      if (! ((*info->callbacks->unattached_reloc)
                             (info, h->root.root.string, input_bfd,
                              input_section, r_vaddr - input_section->vma)))
-                       return false;
+                       return FALSE;
                    }
 
                  relocation = alpha_convert_external_reloc (output_bfd,
@@ -1918,8 +1952,8 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      if (! ((*info->callbacks->undefined_symbol)
                             (info, h->root.root.string, input_bfd,
                              input_section,
-                             r_vaddr - input_section->vma, true)))
-                       return false;
+                             r_vaddr - input_section->vma, TRUE)))
+                       return FALSE;
                      relocation = 0;
                    }
                }
@@ -1962,17 +1996,18 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
                      name = bfd_section_name (input_bfd,
                                               symndx_to_section[r_symndx]);
                    if (! ((*info->callbacks->reloc_overflow)
-                          (info, name, alpha_howto_table[r_type].name,
+                          (info, NULL, name,
+                           alpha_howto_table[r_type].name,
                            (bfd_vma) 0, input_bfd, input_section,
                            r_vaddr - input_section->vma)))
-                     return false;
+                     return FALSE;
                  }
                  break;
                }
            }
        }
 
-      if (info->relocateable && adjust_addrp)
+      if (info->relocatable && adjust_addrp)
        {
          /* Change the address of the relocation.  */
          H_PUT_64 (input_bfd,
@@ -1988,24 +2023,24 @@ alpha_relocate_section (output_bfd, info, input_bfd, input_section,
          if (! ((*info->callbacks->reloc_dangerous)
                 (info, _("GP relative relocation used when GP not defined"),
                  input_bfd, input_section, r_vaddr - input_section->vma)))
-           return false;
+           return FALSE;
          /* Only give the error once per link.  */
          gp = 4;
          _bfd_set_gp_value (output_bfd, gp);
-         gp_undefined = false;
+         gp_undefined = FALSE;
        }
     }
 
   if (tos != 0)
     abort ();
 
-  return true;
+  return TRUE;
 }
 \f
 /* Do final adjustments to the filehdr and the aouthdr.  This routine
    sets the dynamic bits in the file header.  */
 
-static boolean
+static bfd_boolean
 alpha_adjust_headers (abfd, fhdr, ahdr)
      bfd *abfd;
      struct internal_filehdr *fhdr;
@@ -2015,7 +2050,7 @@ alpha_adjust_headers (abfd, fhdr, ahdr)
     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
   else if ((abfd->flags & DYNAMIC) != 0)
     fhdr->f_flags |= F_ALPHA_SHARABLE;
-  return true;
+  return TRUE;
 }
 \f
 /* Archive handling.  In OSF/1 (or Digital Unix) v3.2, Digital
@@ -2085,6 +2120,7 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
   bfd_byte *buf, *p;
   struct bfd_in_memory *bim;
 
+  buf = NULL;
   nbfd = _bfd_get_elt_at_filepos (archive, filepos);
   if (nbfd == NULL)
     goto error_return;
@@ -2116,16 +2152,14 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
     goto error_return;
   size = H_GET_64 (nbfd, ab);
 
-  if (size == 0)
-    buf = NULL;
-  else
+  if (size != 0)
     {
       bfd_size_type left;
       bfd_byte dict[4096];
       unsigned int h;
       bfd_byte b;
 
-      buf = (bfd_byte *) bfd_alloc (nbfd, size);
+      buf = (bfd_byte *) bfd_malloc (size);
       if (buf == NULL)
        goto error_return;
       p = buf;
@@ -2179,13 +2213,13 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
 
   /* Now the uncompressed file contents are in buf.  */
   bim = ((struct bfd_in_memory *)
-        bfd_alloc (nbfd, (bfd_size_type) sizeof (struct bfd_in_memory)));
+        bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
   if (bim == NULL)
     goto error_return;
   bim->size = size;
   bim->buffer = buf;
 
-  nbfd->mtime_set = true;
+  nbfd->mtime_set = TRUE;
   nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
 
   nbfd->flags |= BFD_IN_MEMORY;
@@ -2195,6 +2229,8 @@ alpha_ecoff_get_elt_at_filepos (archive, filepos)
   return nbfd;
 
  error_return:
+  if (buf != NULL)
+    free (buf);
   if (nbfd != NULL)
     bfd_close (nbfd);
   return NULL;
@@ -2236,13 +2272,11 @@ alpha_ecoff_openr_next_archived_file (archive, last_file)
 /* Open the archive file given an index into the armap.  */
 
 static bfd *
-alpha_ecoff_get_elt_at_index (abfd, index)
-     bfd *abfd;
-     symindex index;
+alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
 {
   carsym *entry;
 
-  entry = bfd_ardata (abfd)->symdefs + index;
+  entry = bfd_ardata (abfd)->symdefs + sym_index;
   return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset);
 }
 \f
@@ -2262,14 +2296,15 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
     (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */
     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
     alpha_ecoff_swap_scnhdr_out,
-    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, true, false, 4, false, 2,
+    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE, 
+    ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2,
     alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
     alpha_ecoff_swap_scnhdr_in, NULL,
     alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
     alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
     _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL
+    NULL, NULL, NULL, NULL
   },
   /* Supported architecture.  */
   bfd_arch_alpha,
@@ -2278,10 +2313,10 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
   /* The page boundary used to align sections in a demand-paged
      executable file.  E.g., 0x1000.  */
   0x2000,
-  /* True if the .rdata section is part of the text segment, as on the
-     Alpha.  False if .rdata is part of the data segment, as on the
+  /* TRUE if the .rdata section is part of the text segment, as on the
+     Alpha.  FALSE if .rdata is part of the data segment, as on the
      MIPS.  */
-  true,
+  TRUE,
   /* Bitsize of constructor entries.  */
   64,
   /* Reloc to use for constructor entries.  */
@@ -2343,6 +2378,8 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 
 /* Looking up a reloc type is Alpha specific.  */
 #define _bfd_ecoff_bfd_reloc_type_lookup alpha_bfd_reloc_type_lookup
+#define _bfd_ecoff_bfd_reloc_name_lookup \
+  alpha_bfd_reloc_name_lookup
 
 /* So is getting relocated section contents.  */
 #define _bfd_ecoff_bfd_get_relocated_section_contents \
@@ -2356,7 +2393,11 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
+#define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
+#define _bfd_ecoff_section_already_linked \
+  _bfd_generic_section_already_linked
+#define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
 
 const bfd_target ecoffalpha_little_vec =
 {
@@ -2381,7 +2422,7 @@ const bfd_target ecoffalpha_little_vec =
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
 
   {_bfd_dummy_target, alpha_ecoff_object_p, /* bfd_check_format */
-     _bfd_ecoff_archive_p, _bfd_dummy_target},
+     bfd_generic_archive_p, _bfd_dummy_target},
   {bfd_false, _bfd_ecoff_mkobject,  /* bfd_set_format */
      _bfd_generic_mkarchive, bfd_false},
   {bfd_false, _bfd_ecoff_write_object_contents, /* bfd_write_contents */