Home | History | Annotate | Line # | Download | only in bfd
coff-alpha.c revision 1.8.2.2
      1 /* BFD back-end for ALPHA Extended-Coff files.
      2    Copyright (C) 1993-2020 Free Software Foundation, Inc.
      3    Modified from coff-mips.c by Steve Chamberlain <sac (at) cygnus.com> and
      4    Ian Lance Taylor <ian (at) cygnus.com>.
      5 
      6    This file is part of BFD, the Binary File Descriptor library.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 #include "sysdep.h"
     24 #include "bfd.h"
     25 #include "bfdlink.h"
     26 #include "libbfd.h"
     27 #include "coff/internal.h"
     28 #include "coff/sym.h"
     29 #include "coff/symconst.h"
     30 #include "coff/ecoff.h"
     31 #include "coff/alpha.h"
     32 #include "aout/ar.h"
     33 #include "libcoff.h"
     34 #include "libecoff.h"
     35 
     36 /* Prototypes for static functions.  */
     38 
     39 
     40 
     41 /* ECOFF has COFF sections, but the debugging information is stored in
     43    a completely different format.  ECOFF targets use some of the
     44    swapping routines from coffswap.h, and some of the generic COFF
     45    routines in coffgen.c, but, unlike the real COFF targets, do not
     46    use coffcode.h itself.
     47 
     48    Get the generic COFF swapping routines, except for the reloc,
     49    symbol, and lineno ones.  Give them ecoff names.  Define some
     50    accessor macros for the large sizes used for Alpha ECOFF.  */
     51 
     52 #define GET_FILEHDR_SYMPTR H_GET_64
     53 #define PUT_FILEHDR_SYMPTR H_PUT_64
     54 #define GET_AOUTHDR_TSIZE H_GET_64
     55 #define PUT_AOUTHDR_TSIZE H_PUT_64
     56 #define GET_AOUTHDR_DSIZE H_GET_64
     57 #define PUT_AOUTHDR_DSIZE H_PUT_64
     58 #define GET_AOUTHDR_BSIZE H_GET_64
     59 #define PUT_AOUTHDR_BSIZE H_PUT_64
     60 #define GET_AOUTHDR_ENTRY H_GET_64
     61 #define PUT_AOUTHDR_ENTRY H_PUT_64
     62 #define GET_AOUTHDR_TEXT_START H_GET_64
     63 #define PUT_AOUTHDR_TEXT_START H_PUT_64
     64 #define GET_AOUTHDR_DATA_START H_GET_64
     65 #define PUT_AOUTHDR_DATA_START H_PUT_64
     66 #define GET_SCNHDR_PADDR H_GET_64
     67 #define PUT_SCNHDR_PADDR H_PUT_64
     68 #define GET_SCNHDR_VADDR H_GET_64
     69 #define PUT_SCNHDR_VADDR H_PUT_64
     70 #define GET_SCNHDR_SIZE H_GET_64
     71 #define PUT_SCNHDR_SIZE H_PUT_64
     72 #define GET_SCNHDR_SCNPTR H_GET_64
     73 #define PUT_SCNHDR_SCNPTR H_PUT_64
     74 #define GET_SCNHDR_RELPTR H_GET_64
     75 #define PUT_SCNHDR_RELPTR H_PUT_64
     76 #define GET_SCNHDR_LNNOPTR H_GET_64
     77 #define PUT_SCNHDR_LNNOPTR H_PUT_64
     78 
     79 #define ALPHAECOFF
     80 
     81 #define NO_COFF_RELOCS
     82 #define NO_COFF_SYMBOLS
     83 #define NO_COFF_LINENOS
     84 #define coff_swap_filehdr_in alpha_ecoff_swap_filehdr_in
     85 #define coff_swap_filehdr_out alpha_ecoff_swap_filehdr_out
     86 #define coff_swap_aouthdr_in alpha_ecoff_swap_aouthdr_in
     87 #define coff_swap_aouthdr_out alpha_ecoff_swap_aouthdr_out
     88 #define coff_swap_scnhdr_in alpha_ecoff_swap_scnhdr_in
     89 #define coff_swap_scnhdr_out alpha_ecoff_swap_scnhdr_out
     90 #include "coffswap.h"
     91 
     92 /* Get the ECOFF swapping routines.  */
     93 #define ECOFF_64
     94 #include "ecoffswap.h"
     95 
     96 /* How to process the various reloc types.  */
     98 
     99 static bfd_reloc_status_type
    100 reloc_nil (bfd *abfd ATTRIBUTE_UNUSED,
    101 	   arelent *reloc ATTRIBUTE_UNUSED,
    102 	   asymbol *sym ATTRIBUTE_UNUSED,
    103 	   void * data ATTRIBUTE_UNUSED,
    104 	   asection *sec ATTRIBUTE_UNUSED,
    105 	   bfd *output_bfd ATTRIBUTE_UNUSED,
    106 	   char **error_message ATTRIBUTE_UNUSED)
    107 {
    108   return bfd_reloc_ok;
    109 }
    110 
    111 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
    112    from smaller values.  Start with zero, widen, *then* decrement.  */
    113 #define MINUS_ONE	(((bfd_vma)0) - 1)
    114 
    115 static reloc_howto_type alpha_howto_table[] =
    116 {
    117   /* Reloc type 0 is ignored by itself.  However, it appears after a
    118      GPDISP reloc to identify the location where the low order 16 bits
    119      of the gp register are loaded.  */
    120   HOWTO (ALPHA_R_IGNORE,	/* type */
    121 	 0,			/* rightshift */
    122 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    123 	 8,			/* bitsize */
    124 	 TRUE,			/* pc_relative */
    125 	 0,			/* bitpos */
    126 	 complain_overflow_dont, /* complain_on_overflow */
    127 	 reloc_nil,		/* special_function */
    128 	 "IGNORE",		/* name */
    129 	 TRUE,			/* partial_inplace */
    130 	 0,			/* src_mask */
    131 	 0,			/* dst_mask */
    132 	 TRUE),			/* pcrel_offset */
    133 
    134   /* A 32 bit reference to a symbol.  */
    135   HOWTO (ALPHA_R_REFLONG,	/* type */
    136 	 0,			/* rightshift */
    137 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    138 	 32,			/* bitsize */
    139 	 FALSE,			/* pc_relative */
    140 	 0,			/* bitpos */
    141 	 complain_overflow_bitfield, /* complain_on_overflow */
    142 	 0,			/* special_function */
    143 	 "REFLONG",		/* name */
    144 	 TRUE,			/* partial_inplace */
    145 	 0xffffffff,		/* src_mask */
    146 	 0xffffffff,		/* dst_mask */
    147 	 FALSE),		/* pcrel_offset */
    148 
    149   /* A 64 bit reference to a symbol.  */
    150   HOWTO (ALPHA_R_REFQUAD,	/* type */
    151 	 0,			/* rightshift */
    152 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    153 	 64,			/* bitsize */
    154 	 FALSE,			/* pc_relative */
    155 	 0,			/* bitpos */
    156 	 complain_overflow_bitfield, /* complain_on_overflow */
    157 	 0,			/* special_function */
    158 	 "REFQUAD",		/* name */
    159 	 TRUE,			/* partial_inplace */
    160 	 MINUS_ONE,		/* src_mask */
    161 	 MINUS_ONE,		/* dst_mask */
    162 	 FALSE),		/* pcrel_offset */
    163 
    164   /* A 32 bit GP relative offset.  This is just like REFLONG except
    165      that when the value is used the value of the gp register will be
    166      added in.  */
    167   HOWTO (ALPHA_R_GPREL32,	/* type */
    168 	 0,			/* rightshift */
    169 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    170 	 32,			/* bitsize */
    171 	 FALSE,			/* pc_relative */
    172 	 0,			/* bitpos */
    173 	 complain_overflow_bitfield, /* complain_on_overflow */
    174 	 0,			/* special_function */
    175 	 "GPREL32",		/* name */
    176 	 TRUE,			/* partial_inplace */
    177 	 0xffffffff,		/* src_mask */
    178 	 0xffffffff,		/* dst_mask */
    179 	 FALSE),		/* pcrel_offset */
    180 
    181   /* Used for an instruction that refers to memory off the GP
    182      register.  The offset is 16 bits of the 32 bit instruction.  This
    183      reloc always seems to be against the .lita section.  */
    184   HOWTO (ALPHA_R_LITERAL,	/* type */
    185 	 0,			/* rightshift */
    186 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    187 	 16,			/* bitsize */
    188 	 FALSE,			/* pc_relative */
    189 	 0,			/* bitpos */
    190 	 complain_overflow_signed, /* complain_on_overflow */
    191 	 0,			/* special_function */
    192 	 "LITERAL",		/* name */
    193 	 TRUE,			/* partial_inplace */
    194 	 0xffff,		/* src_mask */
    195 	 0xffff,		/* dst_mask */
    196 	 FALSE),		/* pcrel_offset */
    197 
    198   /* This reloc only appears immediately following a LITERAL reloc.
    199      It identifies a use of the literal.  It seems that the linker can
    200      use this to eliminate a portion of the .lita section.  The symbol
    201      index is special: 1 means the literal address is in the base
    202      register of a memory format instruction; 2 means the literal
    203      address is in the byte offset register of a byte-manipulation
    204      instruction; 3 means the literal address is in the target
    205      register of a jsr instruction.  This does not actually do any
    206      relocation.  */
    207   HOWTO (ALPHA_R_LITUSE,	/* type */
    208 	 0,			/* rightshift */
    209 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    210 	 32,			/* bitsize */
    211 	 FALSE,			/* pc_relative */
    212 	 0,			/* bitpos */
    213 	 complain_overflow_dont, /* complain_on_overflow */
    214 	 reloc_nil,		/* special_function */
    215 	 "LITUSE",		/* name */
    216 	 FALSE,			/* partial_inplace */
    217 	 0,			/* src_mask */
    218 	 0,			/* dst_mask */
    219 	 FALSE),		/* pcrel_offset */
    220 
    221   /* Load the gp register.  This is always used for a ldah instruction
    222      which loads the upper 16 bits of the gp register.  The next reloc
    223      will be an IGNORE reloc which identifies the location of the lda
    224      instruction which loads the lower 16 bits.  The symbol index of
    225      the GPDISP instruction appears to actually be the number of bytes
    226      between the ldah and lda instructions.  This gives two different
    227      ways to determine where the lda instruction is; I don't know why
    228      both are used.  The value to use for the relocation is the
    229      difference between the GP value and the current location; the
    230      load will always be done against a register holding the current
    231      address.  */
    232   HOWTO (ALPHA_R_GPDISP,	/* type */
    233 	 16,			/* rightshift */
    234 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    235 	 16,			/* bitsize */
    236 	 TRUE,			/* pc_relative */
    237 	 0,			/* bitpos */
    238 	 complain_overflow_dont, /* complain_on_overflow */
    239 	 reloc_nil,		/* special_function */
    240 	 "GPDISP",		/* name */
    241 	 TRUE,			/* partial_inplace */
    242 	 0xffff,		/* src_mask */
    243 	 0xffff,		/* dst_mask */
    244 	 TRUE),			/* pcrel_offset */
    245 
    246   /* A 21 bit branch.  The native assembler generates these for
    247      branches within the text segment, and also fills in the PC
    248      relative offset in the instruction.  */
    249   HOWTO (ALPHA_R_BRADDR,	/* type */
    250 	 2,			/* rightshift */
    251 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    252 	 21,			/* bitsize */
    253 	 TRUE,			/* pc_relative */
    254 	 0,			/* bitpos */
    255 	 complain_overflow_signed, /* complain_on_overflow */
    256 	 0,			/* special_function */
    257 	 "BRADDR",		/* name */
    258 	 TRUE,			/* partial_inplace */
    259 	 0x1fffff,		/* src_mask */
    260 	 0x1fffff,		/* dst_mask */
    261 	 FALSE),		/* pcrel_offset */
    262 
    263   /* A hint for a jump to a register.  */
    264   HOWTO (ALPHA_R_HINT,		/* type */
    265 	 2,			/* rightshift */
    266 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    267 	 14,			/* bitsize */
    268 	 TRUE,			/* pc_relative */
    269 	 0,			/* bitpos */
    270 	 complain_overflow_dont, /* complain_on_overflow */
    271 	 0,			/* special_function */
    272 	 "HINT",		/* name */
    273 	 TRUE,			/* partial_inplace */
    274 	 0x3fff,		/* src_mask */
    275 	 0x3fff,		/* dst_mask */
    276 	 FALSE),		/* pcrel_offset */
    277 
    278   /* 16 bit PC relative offset.  */
    279   HOWTO (ALPHA_R_SREL16,	/* type */
    280 	 0,			/* rightshift */
    281 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    282 	 16,			/* bitsize */
    283 	 TRUE,			/* pc_relative */
    284 	 0,			/* bitpos */
    285 	 complain_overflow_signed, /* complain_on_overflow */
    286 	 0,			/* special_function */
    287 	 "SREL16",		/* name */
    288 	 TRUE,			/* partial_inplace */
    289 	 0xffff,		/* src_mask */
    290 	 0xffff,		/* dst_mask */
    291 	 FALSE),		/* pcrel_offset */
    292 
    293   /* 32 bit PC relative offset.  */
    294   HOWTO (ALPHA_R_SREL32,	/* type */
    295 	 0,			/* rightshift */
    296 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    297 	 32,			/* bitsize */
    298 	 TRUE,			/* pc_relative */
    299 	 0,			/* bitpos */
    300 	 complain_overflow_signed, /* complain_on_overflow */
    301 	 0,			/* special_function */
    302 	 "SREL32",		/* name */
    303 	 TRUE,			/* partial_inplace */
    304 	 0xffffffff,		/* src_mask */
    305 	 0xffffffff,		/* dst_mask */
    306 	 FALSE),		/* pcrel_offset */
    307 
    308   /* A 64 bit PC relative offset.  */
    309   HOWTO (ALPHA_R_SREL64,	/* type */
    310 	 0,			/* rightshift */
    311 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    312 	 64,			/* bitsize */
    313 	 TRUE,			/* pc_relative */
    314 	 0,			/* bitpos */
    315 	 complain_overflow_signed, /* complain_on_overflow */
    316 	 0,			/* special_function */
    317 	 "SREL64",		/* name */
    318 	 TRUE,			/* partial_inplace */
    319 	 MINUS_ONE,		/* src_mask */
    320 	 MINUS_ONE,		/* dst_mask */
    321 	 FALSE),		/* pcrel_offset */
    322 
    323   /* Push a value on the reloc evaluation stack.  */
    324   HOWTO (ALPHA_R_OP_PUSH,	/* type */
    325 	 0,			/* rightshift */
    326 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    327 	 0,			/* bitsize */
    328 	 FALSE,			/* pc_relative */
    329 	 0,			/* bitpos */
    330 	 complain_overflow_dont, /* complain_on_overflow */
    331 	 0,			/* special_function */
    332 	 "OP_PUSH",		/* name */
    333 	 FALSE,			/* partial_inplace */
    334 	 0,			/* src_mask */
    335 	 0,			/* dst_mask */
    336 	 FALSE),		/* pcrel_offset */
    337 
    338   /* Store the value from the stack at the given address.  Store it in
    339      a bitfield of size r_size starting at bit position r_offset.  */
    340   HOWTO (ALPHA_R_OP_STORE,	/* type */
    341 	 0,			/* rightshift */
    342 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    343 	 64,			/* bitsize */
    344 	 FALSE,			/* pc_relative */
    345 	 0,			/* bitpos */
    346 	 complain_overflow_dont, /* complain_on_overflow */
    347 	 0,			/* special_function */
    348 	 "OP_STORE",		/* name */
    349 	 FALSE,			/* partial_inplace */
    350 	 0,			/* src_mask */
    351 	 MINUS_ONE,		/* dst_mask */
    352 	 FALSE),		/* pcrel_offset */
    353 
    354   /* Subtract the reloc address from the value on the top of the
    355      relocation stack.  */
    356   HOWTO (ALPHA_R_OP_PSUB,	/* type */
    357 	 0,			/* rightshift */
    358 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    359 	 0,			/* bitsize */
    360 	 FALSE,			/* pc_relative */
    361 	 0,			/* bitpos */
    362 	 complain_overflow_dont, /* complain_on_overflow */
    363 	 0,			/* special_function */
    364 	 "OP_PSUB",		/* name */
    365 	 FALSE,			/* partial_inplace */
    366 	 0,			/* src_mask */
    367 	 0,			/* dst_mask */
    368 	 FALSE),		/* pcrel_offset */
    369 
    370   /* Shift the value on the top of the relocation stack right by the
    371      given value.  */
    372   HOWTO (ALPHA_R_OP_PRSHIFT,	/* type */
    373 	 0,			/* rightshift */
    374 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    375 	 0,			/* bitsize */
    376 	 FALSE,			/* pc_relative */
    377 	 0,			/* bitpos */
    378 	 complain_overflow_dont, /* complain_on_overflow */
    379 	 0,			/* special_function */
    380 	 "OP_PRSHIFT",		/* name */
    381 	 FALSE,			/* partial_inplace */
    382 	 0,			/* src_mask */
    383 	 0,			/* dst_mask */
    384 	 FALSE),		/* pcrel_offset */
    385 
    386   /* Adjust the GP value for a new range in the object file.  */
    387   HOWTO (ALPHA_R_GPVALUE,	/* type */
    388 	 0,			/* rightshift */
    389 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    390 	 0,			/* bitsize */
    391 	 FALSE,			/* pc_relative */
    392 	 0,			/* bitpos */
    393 	 complain_overflow_dont, /* complain_on_overflow */
    394 	 0,			/* special_function */
    395 	 "GPVALUE",		/* name */
    396 	 FALSE,			/* partial_inplace */
    397 	 0,			/* src_mask */
    398 	 0,			/* dst_mask */
    399 	 FALSE)			/* pcrel_offset */
    400 };
    401 
    402 /* Recognize an Alpha ECOFF file.  */
    404 
    405 static const bfd_target *
    406 alpha_ecoff_object_p (bfd *abfd)
    407 {
    408   static const bfd_target *ret;
    409 
    410   ret = coff_object_p (abfd);
    411 
    412   if (ret != NULL)
    413     {
    414       asection *sec;
    415 
    416       /* Alpha ECOFF has a .pdata section.  The lnnoptr field of the
    417 	 .pdata section is the number of entries it contains.  Each
    418 	 entry takes up 8 bytes.  The number of entries is required
    419 	 since the section is aligned to a 16 byte boundary.  When we
    420 	 link .pdata sections together, we do not want to include the
    421 	 alignment bytes.  We handle this on input by faking the size
    422 	 of the .pdata section to remove the unwanted alignment bytes.
    423 	 On output we will set the lnnoptr field and force the
    424 	 alignment.  */
    425       sec = bfd_get_section_by_name (abfd, _PDATA);
    426       if (sec != (asection *) NULL)
    427 	{
    428 	  bfd_size_type size;
    429 
    430 	  size = (bfd_size_type) sec->line_filepos * 8;
    431 	  BFD_ASSERT (size == sec->size
    432 		      || size + 8 == sec->size);
    433 	  if (!bfd_set_section_size (sec, size))
    434 	    return NULL;
    435 	}
    436     }
    437 
    438   return ret;
    439 }
    440 
    441 /* See whether the magic number matches.  */
    442 
    443 static bfd_boolean
    444 alpha_ecoff_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED,
    445 			     void * filehdr)
    446 {
    447   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
    448 
    449   if (! ALPHA_ECOFF_BADMAG (*internal_f))
    450     return TRUE;
    451 
    452   if (ALPHA_ECOFF_COMPRESSEDMAG (*internal_f))
    453     _bfd_error_handler
    454       (_("%pB: cannot handle compressed Alpha binaries; "
    455 	 "use compiler flags, or objZ, to generate uncompressed binaries"),
    456        abfd);
    457 
    458   return FALSE;
    459 }
    460 
    461 /* This is a hook called by coff_real_object_p to create any backend
    462    specific information.  */
    463 
    464 static void *
    465 alpha_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
    466 {
    467   void * ecoff;
    468 
    469   ecoff = _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr);
    470 
    471   if (ecoff != NULL)
    472     {
    473       struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
    474 
    475       /* Set additional BFD flags according to the object type from the
    476 	 machine specific file header flags.  */
    477       switch (internal_f->f_flags & F_ALPHA_OBJECT_TYPE_MASK)
    478 	{
    479 	case F_ALPHA_SHARABLE:
    480 	  abfd->flags |= DYNAMIC;
    481 	  break;
    482 	case F_ALPHA_CALL_SHARED:
    483 	  /* Always executable if using shared libraries as the run time
    484 	     loader might resolve undefined references.  */
    485 	  abfd->flags |= (DYNAMIC | EXEC_P);
    486 	  break;
    487 	}
    488     }
    489   return ecoff;
    490 }
    491 
    492 /* Reloc handling.  */
    494 
    495 /* Swap a reloc in.  */
    496 
    497 static void
    498 alpha_ecoff_swap_reloc_in (bfd *abfd,
    499 			   void * ext_ptr,
    500 			   struct internal_reloc *intern)
    501 {
    502   const RELOC *ext = (RELOC *) ext_ptr;
    503 
    504   intern->r_vaddr = H_GET_64 (abfd, ext->r_vaddr);
    505   intern->r_symndx = H_GET_32 (abfd, ext->r_symndx);
    506 
    507   BFD_ASSERT (bfd_header_little_endian (abfd));
    508 
    509   intern->r_type = ((ext->r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
    510 		    >> RELOC_BITS0_TYPE_SH_LITTLE);
    511   intern->r_extern = (ext->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
    512   intern->r_offset = ((ext->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
    513 		      >> RELOC_BITS1_OFFSET_SH_LITTLE);
    514   /* Ignored the reserved bits.  */
    515   intern->r_size = ((ext->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
    516 		    >> RELOC_BITS3_SIZE_SH_LITTLE);
    517 
    518   if (intern->r_type == ALPHA_R_LITUSE
    519       || intern->r_type == ALPHA_R_GPDISP)
    520     {
    521       /* Handle the LITUSE and GPDISP relocs specially.  Its symndx
    522 	 value is not actually a symbol index, but is instead a
    523 	 special code.  We put the code in the r_size field, and
    524 	 clobber the symndx.  */
    525       if (intern->r_size != 0)
    526 	abort ();
    527       intern->r_size = intern->r_symndx;
    528       intern->r_symndx = RELOC_SECTION_NONE;
    529     }
    530   else if (intern->r_type == ALPHA_R_IGNORE)
    531     {
    532       /* The IGNORE reloc generally follows a GPDISP reloc, and is
    533 	 against the .lita section.  The section is irrelevant.  */
    534       if (! intern->r_extern &&
    535 	  intern->r_symndx == RELOC_SECTION_ABS)
    536 	abort ();
    537       if (! intern->r_extern && intern->r_symndx == RELOC_SECTION_LITA)
    538 	intern->r_symndx = RELOC_SECTION_ABS;
    539     }
    540 }
    541 
    542 /* Swap a reloc out.  */
    543 
    544 static void
    545 alpha_ecoff_swap_reloc_out (bfd *abfd,
    546 			    const struct internal_reloc *intern,
    547 			    void * dst)
    548 {
    549   RELOC *ext = (RELOC *) dst;
    550   long symndx;
    551   unsigned char size;
    552 
    553   /* Undo the hackery done in swap_reloc_in.  */
    554   if (intern->r_type == ALPHA_R_LITUSE
    555       || intern->r_type == ALPHA_R_GPDISP)
    556     {
    557       symndx = intern->r_size;
    558       size = 0;
    559     }
    560   else if (intern->r_type == ALPHA_R_IGNORE
    561 	   && ! intern->r_extern
    562 	   && intern->r_symndx == RELOC_SECTION_ABS)
    563     {
    564       symndx = RELOC_SECTION_LITA;
    565       size = intern->r_size;
    566     }
    567   else
    568     {
    569       symndx = intern->r_symndx;
    570       size = intern->r_size;
    571     }
    572 
    573   /* XXX FIXME:  The maximum symndx value used to be 14 but this
    574      fails with object files produced by DEC's C++ compiler.
    575      Where does the value 14 (or 15) come from anyway ?  */
    576   BFD_ASSERT (intern->r_extern
    577 	      || (intern->r_symndx >= 0 && intern->r_symndx <= 15));
    578 
    579   H_PUT_64 (abfd, intern->r_vaddr, ext->r_vaddr);
    580   H_PUT_32 (abfd, symndx, ext->r_symndx);
    581 
    582   BFD_ASSERT (bfd_header_little_endian (abfd));
    583 
    584   ext->r_bits[0] = ((intern->r_type << RELOC_BITS0_TYPE_SH_LITTLE)
    585 		    & RELOC_BITS0_TYPE_LITTLE);
    586   ext->r_bits[1] = ((intern->r_extern ? RELOC_BITS1_EXTERN_LITTLE : 0)
    587 		    | ((intern->r_offset << RELOC_BITS1_OFFSET_SH_LITTLE)
    588 		       & RELOC_BITS1_OFFSET_LITTLE));
    589   ext->r_bits[2] = 0;
    590   ext->r_bits[3] = ((size << RELOC_BITS3_SIZE_SH_LITTLE)
    591 		    & RELOC_BITS3_SIZE_LITTLE);
    592 }
    593 
    594 /* Finish canonicalizing a reloc.  Part of this is generic to all
    595    ECOFF targets, and that part is in ecoff.c.  The rest is done in
    596    this backend routine.  It must fill in the howto field.  */
    597 
    598 static void
    599 alpha_adjust_reloc_in (bfd *abfd,
    600 		       const struct internal_reloc *intern,
    601 		       arelent *rptr)
    602 {
    603   if (intern->r_type > ALPHA_R_GPVALUE)
    604     {
    605       /* xgettext:c-format */
    606       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    607 			  abfd, intern->r_type);
    608       bfd_set_error (bfd_error_bad_value);
    609       rptr->addend = 0;
    610       rptr->howto  = NULL;
    611       return;
    612     }
    613 
    614   switch (intern->r_type)
    615     {
    616     case ALPHA_R_BRADDR:
    617     case ALPHA_R_SREL16:
    618     case ALPHA_R_SREL32:
    619     case ALPHA_R_SREL64:
    620       /* This relocs appear to be fully resolved when they are against
    621 	 internal symbols.  Against external symbols, BRADDR at least
    622 	 appears to be resolved against the next instruction.  */
    623       if (! intern->r_extern)
    624 	rptr->addend = 0;
    625       else
    626 	rptr->addend = - (intern->r_vaddr + 4);
    627       break;
    628 
    629     case ALPHA_R_GPREL32:
    630     case ALPHA_R_LITERAL:
    631       /* Copy the gp value for this object file into the addend, to
    632 	 ensure that we are not confused by the linker.  */
    633       if (! intern->r_extern)
    634 	rptr->addend += ecoff_data (abfd)->gp;
    635       break;
    636 
    637     case ALPHA_R_LITUSE:
    638     case ALPHA_R_GPDISP:
    639       /* The LITUSE and GPDISP relocs do not use a symbol, or an
    640 	 addend, but they do use a special code.  Put this code in the
    641 	 addend field.  */
    642       rptr->addend = intern->r_size;
    643       break;
    644 
    645     case ALPHA_R_OP_STORE:
    646       /* The STORE reloc needs the size and offset fields.  We store
    647 	 them in the addend.  */
    648 #if 0
    649       BFD_ASSERT (intern->r_offset <= 256);
    650 #endif
    651       rptr->addend = (intern->r_offset << 8) + intern->r_size;
    652       break;
    653 
    654     case ALPHA_R_OP_PUSH:
    655     case ALPHA_R_OP_PSUB:
    656     case ALPHA_R_OP_PRSHIFT:
    657       /* The PUSH, PSUB and PRSHIFT relocs do not actually use an
    658 	 address.  I believe that the address supplied is really an
    659 	 addend.  */
    660       rptr->addend = intern->r_vaddr;
    661       break;
    662 
    663     case ALPHA_R_GPVALUE:
    664       /* Set the addend field to the new GP value.  */
    665       rptr->addend = intern->r_symndx + ecoff_data (abfd)->gp;
    666       break;
    667 
    668     case ALPHA_R_IGNORE:
    669       /* If the type is ALPHA_R_IGNORE, make sure this is a reference
    670 	 to the absolute section so that the reloc is ignored.  For
    671 	 some reason the address of this reloc type is not adjusted by
    672 	 the section vma.  We record the gp value for this object file
    673 	 here, for convenience when doing the GPDISP relocation.  */
    674       rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
    675       rptr->address = intern->r_vaddr;
    676       rptr->addend = ecoff_data (abfd)->gp;
    677       break;
    678 
    679     default:
    680       break;
    681     }
    682 
    683   rptr->howto = &alpha_howto_table[intern->r_type];
    684 }
    685 
    686 /* When writing out a reloc we need to pull some values back out of
    687    the addend field into the reloc.  This is roughly the reverse of
    688    alpha_adjust_reloc_in, except that there are several changes we do
    689    not need to undo.  */
    690 
    691 static void
    692 alpha_adjust_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
    693 			const arelent *rel,
    694 			struct internal_reloc *intern)
    695 {
    696   switch (intern->r_type)
    697     {
    698     case ALPHA_R_LITUSE:
    699     case ALPHA_R_GPDISP:
    700       intern->r_size = rel->addend;
    701       break;
    702 
    703     case ALPHA_R_OP_STORE:
    704       intern->r_size = rel->addend & 0xff;
    705       intern->r_offset = (rel->addend >> 8) & 0xff;
    706       break;
    707 
    708     case ALPHA_R_OP_PUSH:
    709     case ALPHA_R_OP_PSUB:
    710     case ALPHA_R_OP_PRSHIFT:
    711       intern->r_vaddr = rel->addend;
    712       break;
    713 
    714     case ALPHA_R_IGNORE:
    715       intern->r_vaddr = rel->address;
    716       break;
    717 
    718     default:
    719       break;
    720     }
    721 }
    722 
    723 /* The size of the stack for the relocation evaluator.  */
    724 #define RELOC_STACKSIZE (10)
    725 
    726 /* Alpha ECOFF relocs have a built in expression evaluator as well as
    727    other interdependencies.  Rather than use a bunch of special
    728    functions and global variables, we use a single routine to do all
    729    the relocation for a section.  I haven't yet worked out how the
    730    assembler is going to handle this.  */
    731 
    732 static bfd_byte *
    733 alpha_ecoff_get_relocated_section_contents (bfd *abfd,
    734 					    struct bfd_link_info *link_info,
    735 					    struct bfd_link_order *link_order,
    736 					    bfd_byte *data,
    737 					    bfd_boolean relocatable,
    738 					    asymbol **symbols)
    739 {
    740   bfd *input_bfd = link_order->u.indirect.section->owner;
    741   asection *input_section = link_order->u.indirect.section;
    742   long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
    743   arelent **reloc_vector = NULL;
    744   long reloc_count;
    745   bfd *output_bfd = relocatable ? abfd : (bfd *) NULL;
    746   bfd_vma gp;
    747   bfd_size_type sz;
    748   bfd_boolean gp_undefined;
    749   bfd_vma stack[RELOC_STACKSIZE];
    750   int tos = 0;
    751 
    752   if (reloc_size < 0)
    753     goto error_return;
    754   reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
    755   if (reloc_vector == NULL && reloc_size != 0)
    756     goto error_return;
    757 
    758   sz = input_section->rawsize ? input_section->rawsize : input_section->size;
    759   if (! bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
    760     goto error_return;
    761 
    762   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
    763 					reloc_vector, symbols);
    764   if (reloc_count < 0)
    765     goto error_return;
    766   if (reloc_count == 0)
    767     goto successful_return;
    768 
    769   /* Get the GP value for the output BFD.  */
    770   gp_undefined = FALSE;
    771   gp = _bfd_get_gp_value (abfd);
    772   if (gp == 0)
    773     {
    774       if (relocatable)
    775 	{
    776 	  asection *sec;
    777 	  bfd_vma lo;
    778 
    779 	  /* Make up a value.  */
    780 	  lo = (bfd_vma) -1;
    781 	  for (sec = abfd->sections; sec != NULL; sec = sec->next)
    782 	    {
    783 	      if (sec->vma < lo
    784 		  && (strcmp (sec->name, ".sbss") == 0
    785 		      || strcmp (sec->name, ".sdata") == 0
    786 		      || strcmp (sec->name, ".lit4") == 0
    787 		      || strcmp (sec->name, ".lit8") == 0
    788 		      || strcmp (sec->name, ".lita") == 0))
    789 		lo = sec->vma;
    790 	    }
    791 	  gp = lo + 0x8000;
    792 	  _bfd_set_gp_value (abfd, gp);
    793 	}
    794       else
    795 	{
    796 	  struct bfd_link_hash_entry *h;
    797 
    798 	  h = bfd_link_hash_lookup (link_info->hash, "_gp", FALSE, FALSE,
    799 				    TRUE);
    800 	  if (h == (struct bfd_link_hash_entry *) NULL
    801 	      || h->type != bfd_link_hash_defined)
    802 	    gp_undefined = TRUE;
    803 	  else
    804 	    {
    805 	      gp = (h->u.def.value
    806 		    + h->u.def.section->output_section->vma
    807 		    + h->u.def.section->output_offset);
    808 	      _bfd_set_gp_value (abfd, gp);
    809 	    }
    810 	}
    811     }
    812 
    813   for (; *reloc_vector != (arelent *) NULL; reloc_vector++)
    814     {
    815       arelent *rel;
    816       bfd_reloc_status_type r;
    817       char *err;
    818 
    819       rel = *reloc_vector;
    820       r = bfd_reloc_ok;
    821       switch (rel->howto->type)
    822 	{
    823 	case ALPHA_R_IGNORE:
    824 	  rel->address += input_section->output_offset;
    825 	  break;
    826 
    827 	case ALPHA_R_REFLONG:
    828 	case ALPHA_R_REFQUAD:
    829 	case ALPHA_R_BRADDR:
    830 	case ALPHA_R_HINT:
    831 	case ALPHA_R_SREL16:
    832 	case ALPHA_R_SREL32:
    833 	case ALPHA_R_SREL64:
    834 	  if (relocatable
    835 	      && ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
    836 	    {
    837 	      rel->address += input_section->output_offset;
    838 	      break;
    839 	    }
    840 	  r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    841 				      output_bfd, &err);
    842 	  break;
    843 
    844 	case ALPHA_R_GPREL32:
    845 	  /* This relocation is used in a switch table.  It is a 32
    846 	     bit offset from the current GP value.  We must adjust it
    847 	     by the different between the original GP value and the
    848 	     current GP value.  The original GP value is stored in the
    849 	     addend.  We adjust the addend and let
    850 	     bfd_perform_relocation finish the job.  */
    851 	  rel->addend -= gp;
    852 	  r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    853 				      output_bfd, &err);
    854 	  if (r == bfd_reloc_ok && gp_undefined)
    855 	    {
    856 	      r = bfd_reloc_dangerous;
    857 	      err = (char *) _("GP relative relocation used when GP not defined");
    858 	    }
    859 	  break;
    860 
    861 	case ALPHA_R_LITERAL:
    862 	  /* This is a reference to a literal value, generally
    863 	     (always?) in the .lita section.  This is a 16 bit GP
    864 	     relative relocation.  Sometimes the subsequent reloc is a
    865 	     LITUSE reloc, which indicates how this reloc is used.
    866 	     This sometimes permits rewriting the two instructions
    867 	     referred to by the LITERAL and the LITUSE into different
    868 	     instructions which do not refer to .lita.  This can save
    869 	     a memory reference, and permits removing a value from
    870 	     .lita thus saving GP relative space.
    871 
    872 	     We do not these optimizations.  To do them we would need
    873 	     to arrange to link the .lita section first, so that by
    874 	     the time we got here we would know the final values to
    875 	     use.  This would not be particularly difficult, but it is
    876 	     not currently implemented.  */
    877 
    878 	  {
    879 	    unsigned long insn;
    880 
    881 	    /* I believe that the LITERAL reloc will only apply to a
    882 	       ldq or ldl instruction, so check my assumption.  */
    883 	    insn = bfd_get_32 (input_bfd, data + rel->address);
    884 	    BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
    885 			|| ((insn >> 26) & 0x3f) == 0x28);
    886 
    887 	    rel->addend -= gp;
    888 	    r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    889 					output_bfd, &err);
    890 	    if (r == bfd_reloc_ok && gp_undefined)
    891 	      {
    892 		r = bfd_reloc_dangerous;
    893 		err =
    894 		  (char *) _("GP relative relocation used when GP not defined");
    895 	      }
    896 	  }
    897 	  break;
    898 
    899 	case ALPHA_R_LITUSE:
    900 	  /* See ALPHA_R_LITERAL above for the uses of this reloc.  It
    901 	     does not cause anything to happen, itself.  */
    902 	  rel->address += input_section->output_offset;
    903 	  break;
    904 
    905 	case ALPHA_R_GPDISP:
    906 	  /* This marks the ldah of an ldah/lda pair which loads the
    907 	     gp register with the difference of the gp value and the
    908 	     current location.  The second of the pair is r_size bytes
    909 	     ahead; it used to be marked with an ALPHA_R_IGNORE reloc,
    910 	     but that no longer happens in OSF/1 3.2.  */
    911 	  {
    912 	    unsigned long insn1, insn2;
    913 	    bfd_vma addend;
    914 
    915 	    /* Get the two instructions.  */
    916 	    insn1 = bfd_get_32 (input_bfd, data + rel->address);
    917 	    insn2 = bfd_get_32 (input_bfd, data + rel->address + rel->addend);
    918 
    919 	    BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
    920 	    BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
    921 
    922 	    /* Get the existing addend.  We must account for the sign
    923 	       extension done by lda and ldah.  */
    924 	    addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
    925 	    if (insn1 & 0x8000)
    926 	      {
    927 		addend -= 0x80000000;
    928 		addend -= 0x80000000;
    929 	      }
    930 	    if (insn2 & 0x8000)
    931 	      addend -= 0x10000;
    932 
    933 	    /* The existing addend includes the different between the
    934 	       gp of the input BFD and the address in the input BFD.
    935 	       Subtract this out.  */
    936 	    addend -= (ecoff_data (input_bfd)->gp
    937 		       - (input_section->vma + rel->address));
    938 
    939 	    /* Now add in the final gp value, and subtract out the
    940 	       final address.  */
    941 	    addend += (gp
    942 		       - (input_section->output_section->vma
    943 			  + input_section->output_offset
    944 			  + rel->address));
    945 
    946 	    /* Change the instructions, accounting for the sign
    947 	       extension, and write them out.  */
    948 	    if (addend & 0x8000)
    949 	      addend += 0x10000;
    950 	    insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
    951 	    insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
    952 
    953 	    bfd_put_32 (input_bfd, (bfd_vma) insn1, data + rel->address);
    954 	    bfd_put_32 (input_bfd, (bfd_vma) insn2,
    955 			data + rel->address + rel->addend);
    956 
    957 	    rel->address += input_section->output_offset;
    958 	  }
    959 	  break;
    960 
    961 	case ALPHA_R_OP_PUSH:
    962 	  /* Push a value on the reloc evaluation stack.  */
    963 	  {
    964 	    asymbol *symbol;
    965 	    bfd_vma relocation;
    966 
    967 	    if (relocatable)
    968 	      {
    969 		rel->address += input_section->output_offset;
    970 		break;
    971 	      }
    972 
    973 	    /* Figure out the relocation of this symbol.  */
    974 	    symbol = *rel->sym_ptr_ptr;
    975 
    976 	    if (bfd_is_und_section (symbol->section))
    977 	      r = bfd_reloc_undefined;
    978 
    979 	    if (bfd_is_com_section (symbol->section))
    980 	      relocation = 0;
    981 	    else
    982 	      relocation = symbol->value;
    983 	    relocation += symbol->section->output_section->vma;
    984 	    relocation += symbol->section->output_offset;
    985 	    relocation += rel->addend;
    986 
    987 	    if (tos >= RELOC_STACKSIZE)
    988 	      abort ();
    989 
    990 	    stack[tos++] = relocation;
    991 	  }
    992 	  break;
    993 
    994 	case ALPHA_R_OP_STORE:
    995 	  /* Store a value from the reloc stack into a bitfield.  */
    996 	  {
    997 	    bfd_vma val;
    998 	    int offset, size;
    999 
   1000 	    if (relocatable)
   1001 	      {
   1002 		rel->address += input_section->output_offset;
   1003 		break;
   1004 	      }
   1005 
   1006 	    if (tos == 0)
   1007 	      abort ();
   1008 
   1009 	    /* The offset and size for this reloc are encoded into the
   1010 	       addend field by alpha_adjust_reloc_in.  */
   1011 	    offset = (rel->addend >> 8) & 0xff;
   1012 	    size = rel->addend & 0xff;
   1013 
   1014 	    val = bfd_get_64 (abfd, data + rel->address);
   1015 	    val &=~ (((1 << size) - 1) << offset);
   1016 	    val |= (stack[--tos] & ((1 << size) - 1)) << offset;
   1017 	    bfd_put_64 (abfd, val, data + rel->address);
   1018 	  }
   1019 	  break;
   1020 
   1021 	case ALPHA_R_OP_PSUB:
   1022 	  /* Subtract a value from the top of the stack.  */
   1023 	  {
   1024 	    asymbol *symbol;
   1025 	    bfd_vma relocation;
   1026 
   1027 	    if (relocatable)
   1028 	      {
   1029 		rel->address += input_section->output_offset;
   1030 		break;
   1031 	      }
   1032 
   1033 	    /* Figure out the relocation of this symbol.  */
   1034 	    symbol = *rel->sym_ptr_ptr;
   1035 
   1036 	    if (bfd_is_und_section (symbol->section))
   1037 	      r = bfd_reloc_undefined;
   1038 
   1039 	    if (bfd_is_com_section (symbol->section))
   1040 	      relocation = 0;
   1041 	    else
   1042 	      relocation = symbol->value;
   1043 	    relocation += symbol->section->output_section->vma;
   1044 	    relocation += symbol->section->output_offset;
   1045 	    relocation += rel->addend;
   1046 
   1047 	    if (tos == 0)
   1048 	      abort ();
   1049 
   1050 	    stack[tos - 1] -= relocation;
   1051 	  }
   1052 	  break;
   1053 
   1054 	case ALPHA_R_OP_PRSHIFT:
   1055 	  /* Shift the value on the top of the stack.  */
   1056 	  {
   1057 	    asymbol *symbol;
   1058 	    bfd_vma relocation;
   1059 
   1060 	    if (relocatable)
   1061 	      {
   1062 		rel->address += input_section->output_offset;
   1063 		break;
   1064 	      }
   1065 
   1066 	    /* Figure out the relocation of this symbol.  */
   1067 	    symbol = *rel->sym_ptr_ptr;
   1068 
   1069 	    if (bfd_is_und_section (symbol->section))
   1070 	      r = bfd_reloc_undefined;
   1071 
   1072 	    if (bfd_is_com_section (symbol->section))
   1073 	      relocation = 0;
   1074 	    else
   1075 	      relocation = symbol->value;
   1076 	    relocation += symbol->section->output_section->vma;
   1077 	    relocation += symbol->section->output_offset;
   1078 	    relocation += rel->addend;
   1079 
   1080 	    if (tos == 0)
   1081 	      abort ();
   1082 
   1083 	    stack[tos - 1] >>= relocation;
   1084 	  }
   1085 	  break;
   1086 
   1087 	case ALPHA_R_GPVALUE:
   1088 	  /* I really don't know if this does the right thing.  */
   1089 	  gp = rel->addend;
   1090 	  gp_undefined = FALSE;
   1091 	  break;
   1092 
   1093 	default:
   1094 	  abort ();
   1095 	}
   1096 
   1097       if (relocatable)
   1098 	{
   1099 	  asection *os = input_section->output_section;
   1100 
   1101 	  /* A partial link, so keep the relocs.  */
   1102 	  os->orelocation[os->reloc_count] = rel;
   1103 	  os->reloc_count++;
   1104 	}
   1105 
   1106       if (r != bfd_reloc_ok)
   1107 	{
   1108 	  switch (r)
   1109 	    {
   1110 	    case bfd_reloc_undefined:
   1111 	      (*link_info->callbacks->undefined_symbol)
   1112 		(link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
   1113 		 input_bfd, input_section, rel->address, TRUE);
   1114 	      break;
   1115 	    case bfd_reloc_dangerous:
   1116 	      (*link_info->callbacks->reloc_dangerous)
   1117 		(link_info, err, input_bfd, input_section, rel->address);
   1118 	      break;
   1119 	    case bfd_reloc_overflow:
   1120 	      (*link_info->callbacks->reloc_overflow)
   1121 		(link_info, NULL, bfd_asymbol_name (*rel->sym_ptr_ptr),
   1122 		 rel->howto->name, rel->addend, input_bfd,
   1123 		 input_section, rel->address);
   1124 	      break;
   1125 	    case bfd_reloc_outofrange:
   1126 	    default:
   1127 	      abort ();
   1128 	      break;
   1129 	    }
   1130 	}
   1131     }
   1132 
   1133   if (tos != 0)
   1134     abort ();
   1135 
   1136  successful_return:
   1137   if (reloc_vector != NULL)
   1138     free (reloc_vector);
   1139   return data;
   1140 
   1141  error_return:
   1142   if (reloc_vector != NULL)
   1143     free (reloc_vector);
   1144   return NULL;
   1145 }
   1146 
   1147 /* Get the howto structure for a generic reloc type.  */
   1148 
   1149 static reloc_howto_type *
   1150 alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1151 			     bfd_reloc_code_real_type code)
   1152 {
   1153   int alpha_type;
   1154 
   1155   switch (code)
   1156     {
   1157     case BFD_RELOC_32:
   1158       alpha_type = ALPHA_R_REFLONG;
   1159       break;
   1160     case BFD_RELOC_64:
   1161     case BFD_RELOC_CTOR:
   1162       alpha_type = ALPHA_R_REFQUAD;
   1163       break;
   1164     case BFD_RELOC_GPREL32:
   1165       alpha_type = ALPHA_R_GPREL32;
   1166       break;
   1167     case BFD_RELOC_ALPHA_LITERAL:
   1168       alpha_type = ALPHA_R_LITERAL;
   1169       break;
   1170     case BFD_RELOC_ALPHA_LITUSE:
   1171       alpha_type = ALPHA_R_LITUSE;
   1172       break;
   1173     case BFD_RELOC_ALPHA_GPDISP_HI16:
   1174       alpha_type = ALPHA_R_GPDISP;
   1175       break;
   1176     case BFD_RELOC_ALPHA_GPDISP_LO16:
   1177       alpha_type = ALPHA_R_IGNORE;
   1178       break;
   1179     case BFD_RELOC_23_PCREL_S2:
   1180       alpha_type = ALPHA_R_BRADDR;
   1181       break;
   1182     case BFD_RELOC_ALPHA_HINT:
   1183       alpha_type = ALPHA_R_HINT;
   1184       break;
   1185     case BFD_RELOC_16_PCREL:
   1186       alpha_type = ALPHA_R_SREL16;
   1187       break;
   1188     case BFD_RELOC_32_PCREL:
   1189       alpha_type = ALPHA_R_SREL32;
   1190       break;
   1191     case BFD_RELOC_64_PCREL:
   1192       alpha_type = ALPHA_R_SREL64;
   1193       break;
   1194     default:
   1195       return (reloc_howto_type *) NULL;
   1196     }
   1197 
   1198   return &alpha_howto_table[alpha_type];
   1199 }
   1200 
   1201 static reloc_howto_type *
   1202 alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1203 			     const char *r_name)
   1204 {
   1205   unsigned int i;
   1206 
   1207   for (i = 0;
   1208        i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
   1209        i++)
   1210     if (alpha_howto_table[i].name != NULL
   1211 	&& strcasecmp (alpha_howto_table[i].name, r_name) == 0)
   1212       return &alpha_howto_table[i];
   1213 
   1214   return NULL;
   1215 }
   1216 
   1217 /* A helper routine for alpha_relocate_section which converts an
   1219    external reloc when generating relocatable output.  Returns the
   1220    relocation amount.  */
   1221 
   1222 static bfd_vma
   1223 alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
   1224 			      struct bfd_link_info *info,
   1225 			      bfd *input_bfd,
   1226 			      struct external_reloc *ext_rel,
   1227 			      struct ecoff_link_hash_entry *h)
   1228 {
   1229   unsigned long r_symndx;
   1230   bfd_vma relocation;
   1231 
   1232   BFD_ASSERT (bfd_link_relocatable (info));
   1233 
   1234   if (h->root.type == bfd_link_hash_defined
   1235       || h->root.type == bfd_link_hash_defweak)
   1236     {
   1237       asection *hsec;
   1238       const char *name;
   1239 
   1240       /* This symbol is defined in the output.  Convert the reloc from
   1241 	 being against the symbol to being against the section.  */
   1242 
   1243       /* Clear the r_extern bit.  */
   1244       ext_rel->r_bits[1] &=~ RELOC_BITS1_EXTERN_LITTLE;
   1245 
   1246       /* Compute a new r_symndx value.  */
   1247       hsec = h->root.u.def.section;
   1248       name = bfd_section_name (hsec->output_section);
   1249 
   1250       r_symndx = (unsigned long) -1;
   1251       switch (name[1])
   1252 	{
   1253 	case 'A':
   1254 	  if (strcmp (name, "*ABS*") == 0)
   1255 	    r_symndx = RELOC_SECTION_ABS;
   1256 	  break;
   1257 	case 'b':
   1258 	  if (strcmp (name, ".bss") == 0)
   1259 	    r_symndx = RELOC_SECTION_BSS;
   1260 	  break;
   1261 	case 'd':
   1262 	  if (strcmp (name, ".data") == 0)
   1263 	    r_symndx = RELOC_SECTION_DATA;
   1264 	  break;
   1265 	case 'f':
   1266 	  if (strcmp (name, ".fini") == 0)
   1267 	    r_symndx = RELOC_SECTION_FINI;
   1268 	  break;
   1269 	case 'i':
   1270 	  if (strcmp (name, ".init") == 0)
   1271 	    r_symndx = RELOC_SECTION_INIT;
   1272 	  break;
   1273 	case 'l':
   1274 	  if (strcmp (name, ".lita") == 0)
   1275 	    r_symndx = RELOC_SECTION_LITA;
   1276 	  else if (strcmp (name, ".lit8") == 0)
   1277 	    r_symndx = RELOC_SECTION_LIT8;
   1278 	  else if (strcmp (name, ".lit4") == 0)
   1279 	    r_symndx = RELOC_SECTION_LIT4;
   1280 	  break;
   1281 	case 'p':
   1282 	  if (strcmp (name, ".pdata") == 0)
   1283 	    r_symndx = RELOC_SECTION_PDATA;
   1284 	  break;
   1285 	case 'r':
   1286 	  if (strcmp (name, ".rdata") == 0)
   1287 	    r_symndx = RELOC_SECTION_RDATA;
   1288 	  else if (strcmp (name, ".rconst") == 0)
   1289 	    r_symndx = RELOC_SECTION_RCONST;
   1290 	  break;
   1291 	case 's':
   1292 	  if (strcmp (name, ".sdata") == 0)
   1293 	    r_symndx = RELOC_SECTION_SDATA;
   1294 	  else if (strcmp (name, ".sbss") == 0)
   1295 	    r_symndx = RELOC_SECTION_SBSS;
   1296 	  break;
   1297 	case 't':
   1298 	  if (strcmp (name, ".text") == 0)
   1299 	    r_symndx = RELOC_SECTION_TEXT;
   1300 	  break;
   1301 	case 'x':
   1302 	  if (strcmp (name, ".xdata") == 0)
   1303 	    r_symndx = RELOC_SECTION_XDATA;
   1304 	  break;
   1305 	}
   1306 
   1307       if (r_symndx == (unsigned long) -1)
   1308 	abort ();
   1309 
   1310       /* Add the section VMA and the symbol value.  */
   1311       relocation = (h->root.u.def.value
   1312 		    + hsec->output_section->vma
   1313 		    + hsec->output_offset);
   1314     }
   1315   else
   1316     {
   1317       /* Change the symndx value to the right one for
   1318 	 the output BFD.  */
   1319       r_symndx = h->indx;
   1320       if (r_symndx == (unsigned long) -1)
   1321 	{
   1322 	  /* Caller must give an error.  */
   1323 	  r_symndx = 0;
   1324 	}
   1325       relocation = 0;
   1326     }
   1327 
   1328   /* Write out the new r_symndx value.  */
   1329   H_PUT_32 (input_bfd, r_symndx, ext_rel->r_symndx);
   1330 
   1331   return relocation;
   1332 }
   1333 
   1334 /* Relocate a section while linking an Alpha ECOFF file.  This is
   1335    quite similar to get_relocated_section_contents.  Perhaps they
   1336    could be combined somehow.  */
   1337 
   1338 static bfd_boolean
   1339 alpha_relocate_section (bfd *output_bfd,
   1340 			struct bfd_link_info *info,
   1341 			bfd *input_bfd,
   1342 			asection *input_section,
   1343 			bfd_byte *contents,
   1344 			void * external_relocs)
   1345 {
   1346   asection **symndx_to_section, *lita_sec;
   1347   struct ecoff_link_hash_entry **sym_hashes;
   1348   bfd_vma gp;
   1349   bfd_boolean gp_undefined;
   1350   bfd_vma stack[RELOC_STACKSIZE];
   1351   int tos = 0;
   1352   struct external_reloc *ext_rel;
   1353   struct external_reloc *ext_rel_end;
   1354   bfd_size_type amt;
   1355 
   1356   /* We keep a table mapping the symndx found in an internal reloc to
   1357      the appropriate section.  This is faster than looking up the
   1358      section by name each time.  */
   1359   symndx_to_section = ecoff_data (input_bfd)->symndx_to_section;
   1360   if (symndx_to_section == (asection **) NULL)
   1361     {
   1362       amt = NUM_RELOC_SECTIONS * sizeof (asection *);
   1363       symndx_to_section = (asection **) bfd_alloc (input_bfd, amt);
   1364       if (!symndx_to_section)
   1365 	return FALSE;
   1366 
   1367       symndx_to_section[RELOC_SECTION_NONE] = NULL;
   1368       symndx_to_section[RELOC_SECTION_TEXT] =
   1369 	bfd_get_section_by_name (input_bfd, ".text");
   1370       symndx_to_section[RELOC_SECTION_RDATA] =
   1371 	bfd_get_section_by_name (input_bfd, ".rdata");
   1372       symndx_to_section[RELOC_SECTION_DATA] =
   1373 	bfd_get_section_by_name (input_bfd, ".data");
   1374       symndx_to_section[RELOC_SECTION_SDATA] =
   1375 	bfd_get_section_by_name (input_bfd, ".sdata");
   1376       symndx_to_section[RELOC_SECTION_SBSS] =
   1377 	bfd_get_section_by_name (input_bfd, ".sbss");
   1378       symndx_to_section[RELOC_SECTION_BSS] =
   1379 	bfd_get_section_by_name (input_bfd, ".bss");
   1380       symndx_to_section[RELOC_SECTION_INIT] =
   1381 	bfd_get_section_by_name (input_bfd, ".init");
   1382       symndx_to_section[RELOC_SECTION_LIT8] =
   1383 	bfd_get_section_by_name (input_bfd, ".lit8");
   1384       symndx_to_section[RELOC_SECTION_LIT4] =
   1385 	bfd_get_section_by_name (input_bfd, ".lit4");
   1386       symndx_to_section[RELOC_SECTION_XDATA] =
   1387 	bfd_get_section_by_name (input_bfd, ".xdata");
   1388       symndx_to_section[RELOC_SECTION_PDATA] =
   1389 	bfd_get_section_by_name (input_bfd, ".pdata");
   1390       symndx_to_section[RELOC_SECTION_FINI] =
   1391 	bfd_get_section_by_name (input_bfd, ".fini");
   1392       symndx_to_section[RELOC_SECTION_LITA] =
   1393 	bfd_get_section_by_name (input_bfd, ".lita");
   1394       symndx_to_section[RELOC_SECTION_ABS] = bfd_abs_section_ptr;
   1395       symndx_to_section[RELOC_SECTION_RCONST] =
   1396 	bfd_get_section_by_name (input_bfd, ".rconst");
   1397 
   1398       ecoff_data (input_bfd)->symndx_to_section = symndx_to_section;
   1399     }
   1400 
   1401   sym_hashes = ecoff_data (input_bfd)->sym_hashes;
   1402 
   1403   /* On the Alpha, the .lita section must be addressable by the global
   1404      pointer.  To support large programs, we need to allow multiple
   1405      global pointers.  This works as long as each input .lita section
   1406      is <64KB big.  This implies that when producing relocatable
   1407      output, the .lita section is limited to 64KB. .  */
   1408 
   1409   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
   1410   gp = _bfd_get_gp_value (output_bfd);
   1411   if (! bfd_link_relocatable (info) && lita_sec != NULL)
   1412     {
   1413       struct ecoff_section_tdata *lita_sec_data;
   1414 
   1415       /* Make sure we have a section data structure to which we can
   1416 	 hang on to the gp value we pick for the section.  */
   1417       lita_sec_data = ecoff_section_data (input_bfd, lita_sec);
   1418       if (lita_sec_data == NULL)
   1419 	{
   1420 	  amt = sizeof (struct ecoff_section_tdata);
   1421 	  lita_sec_data = ((struct ecoff_section_tdata *)
   1422 			   bfd_zalloc (input_bfd, amt));
   1423 	  lita_sec->used_by_bfd = lita_sec_data;
   1424 	}
   1425 
   1426       if (lita_sec_data->gp != 0)
   1427 	{
   1428 	  /* If we already assigned a gp to this section, we better
   1429 	     stick with that value.  */
   1430 	  gp = lita_sec_data->gp;
   1431 	}
   1432       else
   1433 	{
   1434 	  bfd_vma lita_vma;
   1435 	  bfd_size_type lita_size;
   1436 
   1437 	  lita_vma = lita_sec->output_offset + lita_sec->output_section->vma;
   1438 	  lita_size = lita_sec->size;
   1439 
   1440 	  if (gp == 0
   1441 	      || lita_vma <  gp - 0x8000
   1442 	      || lita_vma + lita_size >= gp + 0x8000)
   1443 	    {
   1444 	      /* Either gp hasn't been set at all or the current gp
   1445 		 cannot address this .lita section.  In both cases we
   1446 		 reset the gp to point into the "middle" of the
   1447 		 current input .lita section.  */
   1448 	      if (gp && !ecoff_data (output_bfd)->issued_multiple_gp_warning)
   1449 		{
   1450 		  (*info->callbacks->warning) (info,
   1451 					       _("using multiple gp values"),
   1452 					       (char *) NULL, output_bfd,
   1453 					       (asection *) NULL, (bfd_vma) 0);
   1454 		  ecoff_data (output_bfd)->issued_multiple_gp_warning = TRUE;
   1455 		}
   1456 	      if (lita_vma < gp - 0x8000)
   1457 		gp = lita_vma + lita_size - 0x8000;
   1458 	      else
   1459 		gp = lita_vma + 0x8000;
   1460 
   1461 	    }
   1462 
   1463 	  lita_sec_data->gp = gp;
   1464 	}
   1465 
   1466       _bfd_set_gp_value (output_bfd, gp);
   1467     }
   1468 
   1469   gp_undefined = (gp == 0);
   1470 
   1471   BFD_ASSERT (bfd_header_little_endian (output_bfd));
   1472   BFD_ASSERT (bfd_header_little_endian (input_bfd));
   1473 
   1474   ext_rel = (struct external_reloc *) external_relocs;
   1475   ext_rel_end = ext_rel + input_section->reloc_count;
   1476   for (; ext_rel < ext_rel_end; ext_rel++)
   1477     {
   1478       bfd_vma r_vaddr;
   1479       unsigned long r_symndx;
   1480       int r_type;
   1481       int r_extern;
   1482       int r_offset;
   1483       int r_size;
   1484       bfd_boolean relocatep;
   1485       bfd_boolean adjust_addrp;
   1486       bfd_boolean gp_usedp;
   1487       bfd_vma addend;
   1488 
   1489       r_vaddr = H_GET_64 (input_bfd, ext_rel->r_vaddr);
   1490       r_symndx = H_GET_32 (input_bfd, ext_rel->r_symndx);
   1491 
   1492       r_type = ((ext_rel->r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
   1493 		>> RELOC_BITS0_TYPE_SH_LITTLE);
   1494       r_extern = (ext_rel->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
   1495       r_offset = ((ext_rel->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
   1496 		  >> RELOC_BITS1_OFFSET_SH_LITTLE);
   1497       /* Ignored the reserved bits.  */
   1498       r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
   1499 		>> RELOC_BITS3_SIZE_SH_LITTLE);
   1500 
   1501       relocatep = FALSE;
   1502       adjust_addrp = TRUE;
   1503       gp_usedp = FALSE;
   1504       addend = 0;
   1505 
   1506       switch (r_type)
   1507 	{
   1508 	case ALPHA_R_GPRELHIGH:
   1509 	  _bfd_error_handler (_("%pB: %s unsupported"),
   1510 			      input_bfd, "ALPHA_R_GPRELHIGH");
   1511 	  bfd_set_error (bfd_error_bad_value);
   1512 	  continue;
   1513 
   1514 	case ALPHA_R_GPRELLOW:
   1515 	  _bfd_error_handler (_("%pB: %s unsupported"),
   1516 			      input_bfd, "ALPHA_R_GPRELLOW");
   1517 	  bfd_set_error (bfd_error_bad_value);
   1518 	  continue;
   1519 
   1520 	default:
   1521 	  /* xgettext:c-format */
   1522 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   1523 			      input_bfd, (int) r_type);
   1524 	  bfd_set_error (bfd_error_bad_value);
   1525 	  continue;
   1526 
   1527 	case ALPHA_R_IGNORE:
   1528 	  /* This reloc appears after a GPDISP reloc.  On earlier
   1529 	     versions of OSF/1, It marked the position of the second
   1530 	     instruction to be altered by the GPDISP reloc, but it is
   1531 	     not otherwise used for anything.  For some reason, the
   1532 	     address of the relocation does not appear to include the
   1533 	     section VMA, unlike the other relocation types.  */
   1534 	  if (bfd_link_relocatable (info))
   1535 	    H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
   1536 		      ext_rel->r_vaddr);
   1537 	  adjust_addrp = FALSE;
   1538 	  break;
   1539 
   1540 	case ALPHA_R_REFLONG:
   1541 	case ALPHA_R_REFQUAD:
   1542 	case ALPHA_R_HINT:
   1543 	  relocatep = TRUE;
   1544 	  break;
   1545 
   1546 	case ALPHA_R_BRADDR:
   1547 	case ALPHA_R_SREL16:
   1548 	case ALPHA_R_SREL32:
   1549 	case ALPHA_R_SREL64:
   1550 	  if (r_extern)
   1551 	    addend += - (r_vaddr + 4);
   1552 	  relocatep = TRUE;
   1553 	  break;
   1554 
   1555 	case ALPHA_R_GPREL32:
   1556 	  /* This relocation is used in a switch table.  It is a 32
   1557 	     bit offset from the current GP value.  We must adjust it
   1558 	     by the different between the original GP value and the
   1559 	     current GP value.  */
   1560 	  relocatep = TRUE;
   1561 	  addend = ecoff_data (input_bfd)->gp - gp;
   1562 	  gp_usedp = TRUE;
   1563 	  break;
   1564 
   1565 	case ALPHA_R_LITERAL:
   1566 	  /* This is a reference to a literal value, generally
   1567 	     (always?) in the .lita section.  This is a 16 bit GP
   1568 	     relative relocation.  Sometimes the subsequent reloc is a
   1569 	     LITUSE reloc, which indicates how this reloc is used.
   1570 	     This sometimes permits rewriting the two instructions
   1571 	     referred to by the LITERAL and the LITUSE into different
   1572 	     instructions which do not refer to .lita.  This can save
   1573 	     a memory reference, and permits removing a value from
   1574 	     .lita thus saving GP relative space.
   1575 
   1576 	     We do not these optimizations.  To do them we would need
   1577 	     to arrange to link the .lita section first, so that by
   1578 	     the time we got here we would know the final values to
   1579 	     use.  This would not be particularly difficult, but it is
   1580 	     not currently implemented.  */
   1581 
   1582 	  /* I believe that the LITERAL reloc will only apply to a ldq
   1583 	     or ldl instruction, so check my assumption.  */
   1584 	  {
   1585 	    unsigned long insn;
   1586 
   1587 	    insn = bfd_get_32 (input_bfd,
   1588 			       contents + r_vaddr - input_section->vma);
   1589 	    BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
   1590 			|| ((insn >> 26) & 0x3f) == 0x28);
   1591 	  }
   1592 
   1593 	  relocatep = TRUE;
   1594 	  addend = ecoff_data (input_bfd)->gp - gp;
   1595 	  gp_usedp = TRUE;
   1596 	  break;
   1597 
   1598 	case ALPHA_R_LITUSE:
   1599 	  /* See ALPHA_R_LITERAL above for the uses of this reloc.  It
   1600 	     does not cause anything to happen, itself.  */
   1601 	  break;
   1602 
   1603 	case ALPHA_R_GPDISP:
   1604 	  /* This marks the ldah of an ldah/lda pair which loads the
   1605 	     gp register with the difference of the gp value and the
   1606 	     current location.  The second of the pair is r_symndx
   1607 	     bytes ahead.  It used to be marked with an ALPHA_R_IGNORE
   1608 	     reloc, but OSF/1 3.2 no longer does that.  */
   1609 	  {
   1610 	    unsigned long insn1, insn2;
   1611 
   1612 	    /* Get the two instructions.  */
   1613 	    insn1 = bfd_get_32 (input_bfd,
   1614 				contents + r_vaddr - input_section->vma);
   1615 	    insn2 = bfd_get_32 (input_bfd,
   1616 				(contents
   1617 				 + r_vaddr
   1618 				 - input_section->vma
   1619 				 + r_symndx));
   1620 
   1621 	    BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
   1622 	    BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
   1623 
   1624 	    /* Get the existing addend.  We must account for the sign
   1625 	       extension done by lda and ldah.  */
   1626 	    addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
   1627 	    if (insn1 & 0x8000)
   1628 	      {
   1629 		/* This is addend -= 0x100000000 without causing an
   1630 		   integer overflow on a 32 bit host.  */
   1631 		addend -= 0x80000000;
   1632 		addend -= 0x80000000;
   1633 	      }
   1634 	    if (insn2 & 0x8000)
   1635 	      addend -= 0x10000;
   1636 
   1637 	    /* The existing addend includes the difference between the
   1638 	       gp of the input BFD and the address in the input BFD.
   1639 	       We want to change this to the difference between the
   1640 	       final GP and the final address.  */
   1641 	    addend += (gp
   1642 		       - ecoff_data (input_bfd)->gp
   1643 		       + input_section->vma
   1644 		       - (input_section->output_section->vma
   1645 			  + input_section->output_offset));
   1646 
   1647 	    /* Change the instructions, accounting for the sign
   1648 	       extension, and write them out.  */
   1649 	    if (addend & 0x8000)
   1650 	      addend += 0x10000;
   1651 	    insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
   1652 	    insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
   1653 
   1654 	    bfd_put_32 (input_bfd, (bfd_vma) insn1,
   1655 			contents + r_vaddr - input_section->vma);
   1656 	    bfd_put_32 (input_bfd, (bfd_vma) insn2,
   1657 			contents + r_vaddr - input_section->vma + r_symndx);
   1658 
   1659 	    gp_usedp = TRUE;
   1660 	  }
   1661 	  break;
   1662 
   1663 	case ALPHA_R_OP_PUSH:
   1664 	case ALPHA_R_OP_PSUB:
   1665 	case ALPHA_R_OP_PRSHIFT:
   1666 	  /* Manipulate values on the reloc evaluation stack.  The
   1667 	     r_vaddr field is not an address in input_section, it is
   1668 	     the current value (including any addend) of the object
   1669 	     being used.  */
   1670 	  if (! r_extern)
   1671 	    {
   1672 	      asection *s;
   1673 
   1674 	      s = symndx_to_section[r_symndx];
   1675 	      if (s == (asection *) NULL)
   1676 		abort ();
   1677 	      addend = s->output_section->vma + s->output_offset - s->vma;
   1678 	    }
   1679 	  else
   1680 	    {
   1681 	      struct ecoff_link_hash_entry *h;
   1682 
   1683 	      h = sym_hashes[r_symndx];
   1684 	      if (h == (struct ecoff_link_hash_entry *) NULL)
   1685 		abort ();
   1686 
   1687 	      if (! bfd_link_relocatable (info))
   1688 		{
   1689 		  if (h->root.type == bfd_link_hash_defined
   1690 		      || h->root.type == bfd_link_hash_defweak)
   1691 		    addend = (h->root.u.def.value
   1692 			      + h->root.u.def.section->output_section->vma
   1693 			      + h->root.u.def.section->output_offset);
   1694 		  else
   1695 		    {
   1696 		      /* Note that we pass the address as 0, since we
   1697 			 do not have a meaningful number for the
   1698 			 location within the section that is being
   1699 			 relocated.  */
   1700 		      (*info->callbacks->undefined_symbol)
   1701 			(info, h->root.root.string, input_bfd,
   1702 			 input_section, (bfd_vma) 0, TRUE);
   1703 		      addend = 0;
   1704 		    }
   1705 		}
   1706 	      else
   1707 		{
   1708 		  if (h->root.type != bfd_link_hash_defined
   1709 		      && h->root.type != bfd_link_hash_defweak
   1710 		      && h->indx == -1)
   1711 		    {
   1712 		      /* This symbol is not being written out.  Pass
   1713 			 the address as 0, as with undefined_symbol,
   1714 			 above.  */
   1715 		      (*info->callbacks->unattached_reloc)
   1716 			(info, h->root.root.string,
   1717 			 input_bfd, input_section, (bfd_vma) 0);
   1718 		    }
   1719 
   1720 		  addend = alpha_convert_external_reloc (output_bfd, info,
   1721 							 input_bfd,
   1722 							 ext_rel, h);
   1723 		}
   1724 	    }
   1725 
   1726 	  addend += r_vaddr;
   1727 
   1728 	  if (bfd_link_relocatable (info))
   1729 	    {
   1730 	      /* Adjust r_vaddr by the addend.  */
   1731 	      H_PUT_64 (input_bfd, addend, ext_rel->r_vaddr);
   1732 	    }
   1733 	  else
   1734 	    {
   1735 	      switch (r_type)
   1736 		{
   1737 		case ALPHA_R_OP_PUSH:
   1738 		  if (tos >= RELOC_STACKSIZE)
   1739 		    abort ();
   1740 		  stack[tos++] = addend;
   1741 		  break;
   1742 
   1743 		case ALPHA_R_OP_PSUB:
   1744 		  if (tos == 0)
   1745 		    abort ();
   1746 		  stack[tos - 1] -= addend;
   1747 		  break;
   1748 
   1749 		case ALPHA_R_OP_PRSHIFT:
   1750 		  if (tos == 0)
   1751 		    abort ();
   1752 		  stack[tos - 1] >>= addend;
   1753 		  break;
   1754 		}
   1755 	    }
   1756 
   1757 	  adjust_addrp = FALSE;
   1758 	  break;
   1759 
   1760 	case ALPHA_R_OP_STORE:
   1761 	  /* Store a value from the reloc stack into a bitfield.  If
   1762 	     we are generating relocatable output, all we do is
   1763 	     adjust the address of the reloc.  */
   1764 	  if (! bfd_link_relocatable (info))
   1765 	    {
   1766 	      bfd_vma mask;
   1767 	      bfd_vma val;
   1768 
   1769 	      if (tos == 0)
   1770 		abort ();
   1771 
   1772 	      /* Get the relocation mask.  The separate steps and the
   1773 		 casts to bfd_vma are attempts to avoid a bug in the
   1774 		 Alpha OSF 1.3 C compiler.  See reloc.c for more
   1775 		 details.  */
   1776 	      mask = 1;
   1777 	      mask <<= (bfd_vma) r_size;
   1778 	      mask -= 1;
   1779 
   1780 	      /* FIXME: I don't know what kind of overflow checking,
   1781 		 if any, should be done here.  */
   1782 	      val = bfd_get_64 (input_bfd,
   1783 				contents + r_vaddr - input_section->vma);
   1784 	      val &=~ mask << (bfd_vma) r_offset;
   1785 	      val |= (stack[--tos] & mask) << (bfd_vma) r_offset;
   1786 	      bfd_put_64 (input_bfd, val,
   1787 			  contents + r_vaddr - input_section->vma);
   1788 	    }
   1789 	  break;
   1790 
   1791 	case ALPHA_R_GPVALUE:
   1792 	  /* I really don't know if this does the right thing.  */
   1793 	  gp = ecoff_data (input_bfd)->gp + r_symndx;
   1794 	  gp_undefined = FALSE;
   1795 	  break;
   1796 	}
   1797 
   1798       if (relocatep)
   1799 	{
   1800 	  reloc_howto_type *howto;
   1801 	  struct ecoff_link_hash_entry *h = NULL;
   1802 	  asection *s = NULL;
   1803 	  bfd_vma relocation;
   1804 	  bfd_reloc_status_type r;
   1805 
   1806 	  /* Perform a relocation.  */
   1807 
   1808 	  howto = &alpha_howto_table[r_type];
   1809 
   1810 	  if (r_extern)
   1811 	    {
   1812 	      h = sym_hashes[r_symndx];
   1813 	      /* If h is NULL, that means that there is a reloc
   1814 		 against an external symbol which we thought was just
   1815 		 a debugging symbol.  This should not happen.  */
   1816 	      if (h == (struct ecoff_link_hash_entry *) NULL)
   1817 		abort ();
   1818 	    }
   1819 	  else
   1820 	    {
   1821 	      if (r_symndx >= NUM_RELOC_SECTIONS)
   1822 		s = NULL;
   1823 	      else
   1824 		s = symndx_to_section[r_symndx];
   1825 
   1826 	      if (s == (asection *) NULL)
   1827 		abort ();
   1828 	    }
   1829 
   1830 	  if (bfd_link_relocatable (info))
   1831 	    {
   1832 	      /* We are generating relocatable output, and must
   1833 		 convert the existing reloc.  */
   1834 	      if (r_extern)
   1835 		{
   1836 		  if (h->root.type != bfd_link_hash_defined
   1837 		      && h->root.type != bfd_link_hash_defweak
   1838 		      && h->indx == -1)
   1839 		    {
   1840 		      /* This symbol is not being written out.  */
   1841 		      (*info->callbacks->unattached_reloc)
   1842 			(info, h->root.root.string, input_bfd,
   1843 			 input_section, r_vaddr - input_section->vma);
   1844 		    }
   1845 
   1846 		  relocation = alpha_convert_external_reloc (output_bfd,
   1847 							     info,
   1848 							     input_bfd,
   1849 							     ext_rel,
   1850 							     h);
   1851 		}
   1852 	      else
   1853 		{
   1854 		  /* This is a relocation against a section.  Adjust
   1855 		     the value by the amount the section moved.  */
   1856 		  relocation = (s->output_section->vma
   1857 				+ s->output_offset
   1858 				- s->vma);
   1859 		}
   1860 
   1861 	      /* If this is PC relative, the existing object file
   1862 		 appears to already have the reloc worked out.  We
   1863 		 must subtract out the old value and add in the new
   1864 		 one.  */
   1865 	      if (howto->pc_relative)
   1866 		relocation -= (input_section->output_section->vma
   1867 			       + input_section->output_offset
   1868 			       - input_section->vma);
   1869 
   1870 	      /* Put in any addend.  */
   1871 	      relocation += addend;
   1872 
   1873 	      /* Adjust the contents.  */
   1874 	      r = _bfd_relocate_contents (howto, input_bfd, relocation,
   1875 					  (contents
   1876 					   + r_vaddr
   1877 					   - input_section->vma));
   1878 	    }
   1879 	  else
   1880 	    {
   1881 	      /* We are producing a final executable.  */
   1882 	      if (r_extern)
   1883 		{
   1884 		  /* This is a reloc against a symbol.  */
   1885 		  if (h->root.type == bfd_link_hash_defined
   1886 		      || h->root.type == bfd_link_hash_defweak)
   1887 		    {
   1888 		      asection *hsec;
   1889 
   1890 		      hsec = h->root.u.def.section;
   1891 		      relocation = (h->root.u.def.value
   1892 				    + hsec->output_section->vma
   1893 				    + hsec->output_offset);
   1894 		    }
   1895 		  else
   1896 		    {
   1897 		      (*info->callbacks->undefined_symbol)
   1898 			(info, h->root.root.string, input_bfd, input_section,
   1899 			 r_vaddr - input_section->vma, TRUE);
   1900 		      relocation = 0;
   1901 		    }
   1902 		}
   1903 	      else
   1904 		{
   1905 		  /* This is a reloc against a section.  */
   1906 		  relocation = (s->output_section->vma
   1907 				+ s->output_offset
   1908 				- s->vma);
   1909 
   1910 		  /* Adjust a PC relative relocation by removing the
   1911 		     reference to the original source section.  */
   1912 		  if (howto->pc_relative)
   1913 		    relocation += input_section->vma;
   1914 		}
   1915 
   1916 	      r = _bfd_final_link_relocate (howto,
   1917 					    input_bfd,
   1918 					    input_section,
   1919 					    contents,
   1920 					    r_vaddr - input_section->vma,
   1921 					    relocation,
   1922 					    addend);
   1923 	    }
   1924 
   1925 	  if (r != bfd_reloc_ok)
   1926 	    {
   1927 	      switch (r)
   1928 		{
   1929 		default:
   1930 		case bfd_reloc_outofrange:
   1931 		  abort ();
   1932 		case bfd_reloc_overflow:
   1933 		  {
   1934 		    const char *name;
   1935 
   1936 		    if (r_extern)
   1937 		      name = sym_hashes[r_symndx]->root.root.string;
   1938 		    else
   1939 		      name = bfd_section_name (symndx_to_section[r_symndx]);
   1940 		    (*info->callbacks->reloc_overflow)
   1941 		      (info, NULL, name, alpha_howto_table[r_type].name,
   1942 		       (bfd_vma) 0, input_bfd, input_section,
   1943 		       r_vaddr - input_section->vma);
   1944 		  }
   1945 		  break;
   1946 		}
   1947 	    }
   1948 	}
   1949 
   1950       if (bfd_link_relocatable (info) && adjust_addrp)
   1951 	{
   1952 	  /* Change the address of the relocation.  */
   1953 	  H_PUT_64 (input_bfd,
   1954 		    (input_section->output_section->vma
   1955 		     + input_section->output_offset
   1956 		     - input_section->vma
   1957 		     + r_vaddr),
   1958 		    ext_rel->r_vaddr);
   1959 	}
   1960 
   1961       if (gp_usedp && gp_undefined)
   1962 	{
   1963 	  (*info->callbacks->reloc_dangerous)
   1964 	    (info, _("GP relative relocation used when GP not defined"),
   1965 	     input_bfd, input_section, r_vaddr - input_section->vma);
   1966 	  /* Only give the error once per link.  */
   1967 	  gp = 4;
   1968 	  _bfd_set_gp_value (output_bfd, gp);
   1969 	  gp_undefined = FALSE;
   1970 	}
   1971     }
   1972 
   1973   if (tos != 0)
   1974     abort ();
   1975 
   1976   return TRUE;
   1977 }
   1978 
   1979 /* Do final adjustments to the filehdr and the aouthdr.  This routine
   1981    sets the dynamic bits in the file header.  */
   1982 
   1983 static bfd_boolean
   1984 alpha_adjust_headers (bfd *abfd,
   1985 		      struct internal_filehdr *fhdr,
   1986 		      struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED)
   1987 {
   1988   if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P))
   1989     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
   1990   else if ((abfd->flags & DYNAMIC) != 0)
   1991     fhdr->f_flags |= F_ALPHA_SHARABLE;
   1992   return TRUE;
   1993 }
   1994 
   1995 /* Archive handling.  In OSF/1 (or Digital Unix) v3.2, Digital
   1997    introduced archive packing, in which the elements in an archive are
   1998    optionally compressed using a simple dictionary scheme.  We know
   1999    how to read such archives, but we don't write them.  */
   2000 
   2001 #define alpha_ecoff_slurp_armap _bfd_ecoff_slurp_armap
   2002 #define alpha_ecoff_slurp_extended_name_table \
   2003   _bfd_ecoff_slurp_extended_name_table
   2004 #define alpha_ecoff_construct_extended_name_table \
   2005   _bfd_ecoff_construct_extended_name_table
   2006 #define alpha_ecoff_truncate_arname _bfd_ecoff_truncate_arname
   2007 #define alpha_ecoff_write_armap _bfd_ecoff_write_armap
   2008 #define alpha_ecoff_write_ar_hdr _bfd_generic_write_ar_hdr
   2009 #define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt
   2010 #define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp
   2011 
   2012 /* A compressed file uses this instead of ARFMAG.  */
   2013 
   2014 #define ARFZMAG "Z\012"
   2015 
   2016 /* Read an archive header.  This is like the standard routine, but it
   2017    also accepts ARFZMAG.  */
   2018 
   2019 static void *
   2020 alpha_ecoff_read_ar_hdr (bfd *abfd)
   2021 {
   2022   struct areltdata *ret;
   2023   struct ar_hdr *h;
   2024 
   2025   ret = (struct areltdata *) _bfd_generic_read_ar_hdr_mag (abfd, ARFZMAG);
   2026   if (ret == NULL)
   2027     return NULL;
   2028 
   2029   h = (struct ar_hdr *) ret->arch_header;
   2030   if (strncmp (h->ar_fmag, ARFZMAG, 2) == 0)
   2031     {
   2032       bfd_byte ab[8];
   2033 
   2034       /* This is a compressed file.  We must set the size correctly.
   2035 	 The size is the eight bytes after the dummy file header.  */
   2036       if (bfd_seek (abfd, (file_ptr) FILHSZ, SEEK_CUR) != 0
   2037 	  || bfd_bread (ab, (bfd_size_type) 8, abfd) != 8
   2038 	  || bfd_seek (abfd, (file_ptr) (- (FILHSZ + 8)), SEEK_CUR) != 0)
   2039 	{
   2040 	  free (ret);
   2041 	  return NULL;
   2042 	}
   2043 
   2044       ret->parsed_size = H_GET_64 (abfd, ab);
   2045     }
   2046 
   2047   return ret;
   2048 }
   2049 
   2050 /* Get an archive element at a specified file position.  This is where
   2051    we uncompress the archive element if necessary.  */
   2052 
   2053 static bfd *
   2054 alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
   2055 {
   2056   bfd *nbfd = NULL;
   2057   struct areltdata *tdata;
   2058   struct ar_hdr *hdr;
   2059   bfd_byte ab[8];
   2060   bfd_size_type size;
   2061   bfd_byte *buf, *p;
   2062   struct bfd_in_memory *bim;
   2063 
   2064   buf = NULL;
   2065   nbfd = _bfd_get_elt_at_filepos (archive, filepos);
   2066   if (nbfd == NULL)
   2067     goto error_return;
   2068 
   2069   if ((nbfd->flags & BFD_IN_MEMORY) != 0)
   2070     {
   2071       /* We have already expanded this BFD.  */
   2072       return nbfd;
   2073     }
   2074 
   2075   tdata = (struct areltdata *) nbfd->arelt_data;
   2076   hdr = (struct ar_hdr *) tdata->arch_header;
   2077   if (strncmp (hdr->ar_fmag, ARFZMAG, 2) != 0)
   2078     return nbfd;
   2079 
   2080   /* We must uncompress this element.  We do this by copying it into a
   2081      memory buffer, and making bfd_bread and bfd_seek use that buffer.
   2082      This can use a lot of memory, but it's simpler than getting a
   2083      temporary file, making that work with the file descriptor caching
   2084      code, and making sure that it is deleted at all appropriate
   2085      times.  It can be changed if it ever becomes important.  */
   2086 
   2087   /* The compressed file starts with a dummy ECOFF file header.  */
   2088   if (bfd_seek (nbfd, (file_ptr) FILHSZ, SEEK_SET) != 0)
   2089     goto error_return;
   2090 
   2091   /* The next eight bytes are the real file size.  */
   2092   if (bfd_bread (ab, (bfd_size_type) 8, nbfd) != 8)
   2093     goto error_return;
   2094   size = H_GET_64 (nbfd, ab);
   2095 
   2096   if (size != 0)
   2097     {
   2098       bfd_size_type left;
   2099       bfd_byte dict[4096];
   2100       unsigned int h;
   2101       bfd_byte b;
   2102 
   2103       buf = (bfd_byte *) bfd_malloc (size);
   2104       if (buf == NULL)
   2105 	goto error_return;
   2106       p = buf;
   2107 
   2108       left = size;
   2109 
   2110       /* I don't know what the next eight bytes are for.  */
   2111       if (bfd_bread (ab, (bfd_size_type) 8, nbfd) != 8)
   2112 	goto error_return;
   2113 
   2114       /* This is the uncompression algorithm.  It's a simple
   2115 	 dictionary based scheme in which each character is predicted
   2116 	 by a hash of the previous three characters.  A control byte
   2117 	 indicates whether the character is predicted or whether it
   2118 	 appears in the input stream; each control byte manages the
   2119 	 next eight bytes in the output stream.  */
   2120       memset (dict, 0, sizeof dict);
   2121       h = 0;
   2122       while (bfd_bread (&b, (bfd_size_type) 1, nbfd) == 1)
   2123 	{
   2124 	  unsigned int i;
   2125 
   2126 	  for (i = 0; i < 8; i++, b >>= 1)
   2127 	    {
   2128 	      bfd_byte n;
   2129 
   2130 	      if ((b & 1) == 0)
   2131 		n = dict[h];
   2132 	      else
   2133 		{
   2134 		  if (! bfd_bread (&n, (bfd_size_type) 1, nbfd))
   2135 		    goto error_return;
   2136 		  dict[h] = n;
   2137 		}
   2138 
   2139 	      *p++ = n;
   2140 
   2141 	      --left;
   2142 	      if (left == 0)
   2143 		break;
   2144 
   2145 	      h <<= 4;
   2146 	      h ^= n;
   2147 	      h &= sizeof dict - 1;
   2148 	    }
   2149 
   2150 	  if (left == 0)
   2151 	    break;
   2152 	}
   2153     }
   2154 
   2155   /* Now the uncompressed file contents are in buf.  */
   2156   bim = ((struct bfd_in_memory *)
   2157 	 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
   2158   if (bim == NULL)
   2159     goto error_return;
   2160   bim->size = size;
   2161   bim->buffer = buf;
   2162 
   2163   nbfd->mtime_set = TRUE;
   2164   nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
   2165 
   2166   nbfd->flags |= BFD_IN_MEMORY;
   2167   nbfd->iostream = bim;
   2168   nbfd->iovec = &_bfd_memory_iovec;
   2169   nbfd->origin = 0;
   2170   BFD_ASSERT (! nbfd->cacheable);
   2171 
   2172   return nbfd;
   2173 
   2174  error_return:
   2175   if (buf != NULL)
   2176     free (buf);
   2177   if (nbfd != NULL)
   2178     bfd_close (nbfd);
   2179   return NULL;
   2180 }
   2181 
   2182 /* Open the next archived file.  */
   2183 
   2184 static bfd *
   2185 alpha_ecoff_openr_next_archived_file (bfd *archive, bfd *last_file)
   2186 {
   2187   ufile_ptr filestart;
   2188 
   2189   if (last_file == NULL)
   2190     filestart = bfd_ardata (archive)->first_file_filepos;
   2191   else
   2192     {
   2193       struct areltdata *t;
   2194       struct ar_hdr *h;
   2195       bfd_size_type size;
   2196 
   2197       /* We can't use arelt_size here, because that uses parsed_size,
   2198 	 which is the uncompressed size.  We need the compressed size.  */
   2199       t = (struct areltdata *) last_file->arelt_data;
   2200       h = (struct ar_hdr *) t->arch_header;
   2201       size = strtol (h->ar_size, (char **) NULL, 10);
   2202 
   2203       /* Pad to an even boundary...
   2204 	 Note that last_file->origin can be odd in the case of
   2205 	 BSD-4.4-style element with a long odd size.  */
   2206       filestart = last_file->proxy_origin + size;
   2207       filestart += filestart % 2;
   2208       if (filestart < last_file->proxy_origin)
   2209 	{
   2210 	  /* Prevent looping.  See PR19256.  */
   2211 	  bfd_set_error (bfd_error_malformed_archive);
   2212 	  return NULL;
   2213 	}
   2214     }
   2215 
   2216   return alpha_ecoff_get_elt_at_filepos (archive, filestart);
   2217 }
   2218 
   2219 /* Open the archive file given an index into the armap.  */
   2220 
   2221 static bfd *
   2222 alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
   2223 {
   2224   carsym *entry;
   2225 
   2226   entry = bfd_ardata (abfd)->symdefs + sym_index;
   2227   return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset);
   2228 }
   2229 
   2230 static void
   2231 alpha_ecoff_swap_coff_aux_in (bfd *abfd ATTRIBUTE_UNUSED,
   2232 			      void *ext1 ATTRIBUTE_UNUSED,
   2233 			      int type ATTRIBUTE_UNUSED,
   2234 			      int in_class ATTRIBUTE_UNUSED,
   2235 			      int indx ATTRIBUTE_UNUSED,
   2236 			      int numaux ATTRIBUTE_UNUSED,
   2237 			      void *in1 ATTRIBUTE_UNUSED)
   2238 {
   2239 }
   2240 
   2241 static void
   2242 alpha_ecoff_swap_coff_sym_in (bfd *abfd ATTRIBUTE_UNUSED,
   2243 			      void *ext1 ATTRIBUTE_UNUSED,
   2244 			      void *in1 ATTRIBUTE_UNUSED)
   2245 {
   2246 }
   2247 
   2248 static void
   2249 alpha_ecoff_swap_coff_lineno_in (bfd *abfd ATTRIBUTE_UNUSED,
   2250 				 void *ext1 ATTRIBUTE_UNUSED,
   2251 				 void *in1 ATTRIBUTE_UNUSED)
   2252 {
   2253 }
   2254 
   2255 static unsigned int
   2256 alpha_ecoff_swap_coff_aux_out (bfd *abfd ATTRIBUTE_UNUSED,
   2257 			       void *inp ATTRIBUTE_UNUSED,
   2258 			       int type ATTRIBUTE_UNUSED,
   2259 			       int in_class ATTRIBUTE_UNUSED,
   2260 			       int indx ATTRIBUTE_UNUSED,
   2261 			       int numaux ATTRIBUTE_UNUSED,
   2262 			       void *extp ATTRIBUTE_UNUSED)
   2263 {
   2264   return 0;
   2265 }
   2266 
   2267 static unsigned int
   2268 alpha_ecoff_swap_coff_sym_out (bfd *abfd ATTRIBUTE_UNUSED,
   2269 			       void *inp ATTRIBUTE_UNUSED,
   2270 			       void *extp ATTRIBUTE_UNUSED)
   2271 {
   2272   return 0;
   2273 }
   2274 
   2275 static unsigned int
   2276 alpha_ecoff_swap_coff_lineno_out (bfd *abfd ATTRIBUTE_UNUSED,
   2277 				  void *inp ATTRIBUTE_UNUSED,
   2278 				  void *extp ATTRIBUTE_UNUSED)
   2279 {
   2280   return 0;
   2281 }
   2282 
   2283 static unsigned int
   2284 alpha_ecoff_swap_coff_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
   2285 				 void *inp ATTRIBUTE_UNUSED,
   2286 				 void *extp ATTRIBUTE_UNUSED)
   2287 {
   2288   return 0;
   2289 }
   2290 
   2291 /* This is the ECOFF backend structure.  The backend field of the
   2293    target vector points to this.  */
   2294 
   2295 static const struct ecoff_backend_data alpha_ecoff_backend_data =
   2296 {
   2297   /* COFF backend structure.  */
   2298   {
   2299     alpha_ecoff_swap_coff_aux_in, alpha_ecoff_swap_coff_sym_in,
   2300     alpha_ecoff_swap_coff_lineno_in, alpha_ecoff_swap_coff_aux_out,
   2301     alpha_ecoff_swap_coff_sym_out, alpha_ecoff_swap_coff_lineno_out,
   2302     alpha_ecoff_swap_coff_reloc_out,
   2303     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
   2304     alpha_ecoff_swap_scnhdr_out,
   2305     FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE,
   2306     ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768,
   2307     alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
   2308     alpha_ecoff_swap_scnhdr_in, NULL,
   2309     alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
   2310     alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
   2311     _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
   2312     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
   2313     NULL, NULL, NULL, NULL
   2314   },
   2315   /* Supported architecture.  */
   2316   bfd_arch_alpha,
   2317   /* Initial portion of armap string.  */
   2318   "________64",
   2319   /* The page boundary used to align sections in a demand-paged
   2320      executable file.  E.g., 0x1000.  */
   2321   0x2000,
   2322   /* TRUE if the .rdata section is part of the text segment, as on the
   2323      Alpha.  FALSE if .rdata is part of the data segment, as on the
   2324      MIPS.  */
   2325   TRUE,
   2326   /* Bitsize of constructor entries.  */
   2327   64,
   2328   /* Reloc to use for constructor entries.  */
   2329   &alpha_howto_table[ALPHA_R_REFQUAD],
   2330   {
   2331     /* Symbol table magic number.  */
   2332     magicSym2,
   2333     /* Alignment of debugging information.  E.g., 4.  */
   2334     8,
   2335     /* Sizes of external symbolic information.  */
   2336     sizeof (struct hdr_ext),
   2337     sizeof (struct dnr_ext),
   2338     sizeof (struct pdr_ext),
   2339     sizeof (struct sym_ext),
   2340     sizeof (struct opt_ext),
   2341     sizeof (struct fdr_ext),
   2342     sizeof (struct rfd_ext),
   2343     sizeof (struct ext_ext),
   2344     /* Functions to swap in external symbolic data.  */
   2345     ecoff_swap_hdr_in,
   2346     ecoff_swap_dnr_in,
   2347     ecoff_swap_pdr_in,
   2348     ecoff_swap_sym_in,
   2349     ecoff_swap_opt_in,
   2350     ecoff_swap_fdr_in,
   2351     ecoff_swap_rfd_in,
   2352     ecoff_swap_ext_in,
   2353     _bfd_ecoff_swap_tir_in,
   2354     _bfd_ecoff_swap_rndx_in,
   2355     /* Functions to swap out external symbolic data.  */
   2356     ecoff_swap_hdr_out,
   2357     ecoff_swap_dnr_out,
   2358     ecoff_swap_pdr_out,
   2359     ecoff_swap_sym_out,
   2360     ecoff_swap_opt_out,
   2361     ecoff_swap_fdr_out,
   2362     ecoff_swap_rfd_out,
   2363     ecoff_swap_ext_out,
   2364     _bfd_ecoff_swap_tir_out,
   2365     _bfd_ecoff_swap_rndx_out,
   2366     /* Function to read in symbolic data.  */
   2367     _bfd_ecoff_slurp_symbolic_info
   2368   },
   2369   /* External reloc size.  */
   2370   RELSZ,
   2371   /* Reloc swapping functions.  */
   2372   alpha_ecoff_swap_reloc_in,
   2373   alpha_ecoff_swap_reloc_out,
   2374   /* Backend reloc tweaking.  */
   2375   alpha_adjust_reloc_in,
   2376   alpha_adjust_reloc_out,
   2377   /* Relocate section contents while linking.  */
   2378   alpha_relocate_section,
   2379   /* Do final adjustments to filehdr and aouthdr.  */
   2380   alpha_adjust_headers,
   2381   /* Read an element from an archive at a given file position.  */
   2382   alpha_ecoff_get_elt_at_filepos
   2383 };
   2384 
   2385 /* Looking up a reloc type is Alpha specific.  */
   2386 #define _bfd_ecoff_bfd_reloc_type_lookup alpha_bfd_reloc_type_lookup
   2387 #define _bfd_ecoff_bfd_reloc_name_lookup \
   2388   alpha_bfd_reloc_name_lookup
   2389 
   2390 /* So is getting relocated section contents.  */
   2391 #define _bfd_ecoff_bfd_get_relocated_section_contents \
   2392   alpha_ecoff_get_relocated_section_contents
   2393 
   2394 /* Handling file windows is generic.  */
   2395 #define _bfd_ecoff_get_section_contents_in_window \
   2396   _bfd_generic_get_section_contents_in_window
   2397 
   2398 /* Input section flag lookup is generic.  */
   2399 #define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
   2400 
   2401 /* Relaxing sections is generic.  */
   2402 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
   2403 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
   2404 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
   2405 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
   2406 #define _bfd_ecoff_bfd_group_name bfd_generic_group_name
   2407 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
   2408 #define _bfd_ecoff_section_already_linked \
   2409   _bfd_coff_section_already_linked
   2410 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
   2411 #define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
   2412 #define _bfd_ecoff_bfd_define_start_stop    bfd_generic_define_start_stop
   2413 #define _bfd_ecoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
   2414 
   2415 /* Installing internal relocations in a section is also generic.  */
   2416 #define _bfd_ecoff_set_reloc _bfd_generic_set_reloc
   2417 
   2418 const bfd_target alpha_ecoff_le_vec =
   2419 {
   2420   "ecoff-littlealpha",		/* name */
   2421   bfd_target_ecoff_flavour,
   2422   BFD_ENDIAN_LITTLE,		/* data byte order is little */
   2423   BFD_ENDIAN_LITTLE,		/* header byte order is little */
   2424 
   2425   (HAS_RELOC | EXEC_P		/* object flags */
   2426    | HAS_LINENO | HAS_DEBUG
   2427    | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
   2428 
   2429   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
   2430   0,				/* leading underscore */
   2431   ' ',				/* ar_pad_char */
   2432   15,				/* ar_max_namelen */
   2433   0,				/* match priority.  */
   2434   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   2435      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   2436      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
   2437   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   2438      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   2439      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
   2440 
   2441   {				/* bfd_check_format */
   2442     _bfd_dummy_target,
   2443     alpha_ecoff_object_p,
   2444     bfd_generic_archive_p,
   2445     _bfd_dummy_target
   2446   },
   2447   {				/* bfd_set_format */
   2448     _bfd_bool_bfd_false_error,
   2449     _bfd_ecoff_mkobject,
   2450     _bfd_generic_mkarchive,
   2451     _bfd_bool_bfd_false_error
   2452   },
   2453   {				/* bfd_write_contents */
   2454     _bfd_bool_bfd_false_error,
   2455     _bfd_ecoff_write_object_contents,
   2456     _bfd_write_archive_contents,
   2457     _bfd_bool_bfd_false_error
   2458   },
   2459 
   2460   BFD_JUMP_TABLE_GENERIC (_bfd_ecoff),
   2461   BFD_JUMP_TABLE_COPY (_bfd_ecoff),
   2462   BFD_JUMP_TABLE_CORE (_bfd_nocore),
   2463   BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff),
   2464   BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff),
   2465   BFD_JUMP_TABLE_RELOCS (_bfd_ecoff),
   2466   BFD_JUMP_TABLE_WRITE (_bfd_ecoff),
   2467   BFD_JUMP_TABLE_LINK (_bfd_ecoff),
   2468   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
   2469 
   2470   NULL,
   2471 
   2472   &alpha_ecoff_backend_data
   2473 };
   2474