Home | History | Annotate | Line # | Download | only in bfd
coff-alpha.c revision 1.1.1.10
      1 /* BFD back-end for ALPHA Extended-Coff files.
      2    Copyright (C) 1993-2022 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 	 1,			/* size */
    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 	 4,			/* size */
    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 	 8,			/* size */
    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 	 4,			/* size */
    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 	 4,			/* size */
    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 	 4,			/* size */
    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 	 4,			/* size */
    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 	 4,			/* size */
    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 	 4,			/* size */
    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 	 2,			/* size */
    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 	 4,			/* size */
    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 	 8,			/* size */
    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 */
    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 	 8,			/* size */
    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 */
    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 */
    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 */
    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 bfd_cleanup
    406 alpha_ecoff_object_p (bfd *abfd)
    407 {
    408   bfd_cleanup 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 bool
    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       BFD_ASSERT (intern->r_offset <= 256);
    649       rptr->addend = (intern->r_offset << 8) + intern->r_size;
    650       break;
    651 
    652     case ALPHA_R_OP_PUSH:
    653     case ALPHA_R_OP_PSUB:
    654     case ALPHA_R_OP_PRSHIFT:
    655       /* The PUSH, PSUB and PRSHIFT relocs do not actually use an
    656 	 address.  I believe that the address supplied is really an
    657 	 addend.  */
    658       rptr->addend = intern->r_vaddr;
    659       break;
    660 
    661     case ALPHA_R_GPVALUE:
    662       /* Set the addend field to the new GP value.  */
    663       rptr->addend = intern->r_symndx + ecoff_data (abfd)->gp;
    664       break;
    665 
    666     case ALPHA_R_IGNORE:
    667       /* If the type is ALPHA_R_IGNORE, make sure this is a reference
    668 	 to the absolute section so that the reloc is ignored.  For
    669 	 some reason the address of this reloc type is not adjusted by
    670 	 the section vma.  We record the gp value for this object file
    671 	 here, for convenience when doing the GPDISP relocation.  */
    672       rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
    673       rptr->address = intern->r_vaddr;
    674       rptr->addend = ecoff_data (abfd)->gp;
    675       break;
    676 
    677     default:
    678       break;
    679     }
    680 
    681   rptr->howto = &alpha_howto_table[intern->r_type];
    682 }
    683 
    684 /* When writing out a reloc we need to pull some values back out of
    685    the addend field into the reloc.  This is roughly the reverse of
    686    alpha_adjust_reloc_in, except that there are several changes we do
    687    not need to undo.  */
    688 
    689 static void
    690 alpha_adjust_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
    691 			const arelent *rel,
    692 			struct internal_reloc *intern)
    693 {
    694   switch (intern->r_type)
    695     {
    696     case ALPHA_R_LITUSE:
    697     case ALPHA_R_GPDISP:
    698       intern->r_size = rel->addend;
    699       break;
    700 
    701     case ALPHA_R_OP_STORE:
    702       intern->r_size = rel->addend & 0xff;
    703       intern->r_offset = (rel->addend >> 8) & 0xff;
    704       break;
    705 
    706     case ALPHA_R_OP_PUSH:
    707     case ALPHA_R_OP_PSUB:
    708     case ALPHA_R_OP_PRSHIFT:
    709       intern->r_vaddr = rel->addend;
    710       break;
    711 
    712     case ALPHA_R_IGNORE:
    713       intern->r_vaddr = rel->address;
    714       break;
    715 
    716     default:
    717       break;
    718     }
    719 }
    720 
    721 /* The size of the stack for the relocation evaluator.  */
    722 #define RELOC_STACKSIZE (10)
    723 
    724 /* Alpha ECOFF relocs have a built in expression evaluator as well as
    725    other interdependencies.  Rather than use a bunch of special
    726    functions and global variables, we use a single routine to do all
    727    the relocation for a section.  I haven't yet worked out how the
    728    assembler is going to handle this.  */
    729 
    730 static bfd_byte *
    731 alpha_ecoff_get_relocated_section_contents (bfd *abfd,
    732 					    struct bfd_link_info *link_info,
    733 					    struct bfd_link_order *link_order,
    734 					    bfd_byte *data,
    735 					    bool relocatable,
    736 					    asymbol **symbols)
    737 {
    738   bfd *input_bfd = link_order->u.indirect.section->owner;
    739   asection *input_section = link_order->u.indirect.section;
    740   long reloc_size;
    741   arelent **reloc_vector;
    742   long reloc_count;
    743   bfd *output_bfd = relocatable ? abfd : (bfd *) NULL;
    744   bfd_vma gp;
    745   bool gp_undefined;
    746   bfd_vma stack[RELOC_STACKSIZE];
    747   int tos = 0;
    748 
    749   reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
    750   if (reloc_size < 0)
    751     return NULL;
    752 
    753   if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
    754     return NULL;
    755 
    756   if (data == NULL)
    757     return NULL;
    758 
    759   if (reloc_size == 0)
    760     return data;
    761 
    762   reloc_vector = (arelent **) bfd_malloc (reloc_size);
    763   if (reloc_vector == NULL)
    764     return NULL;
    765 
    766   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
    767 					reloc_vector, symbols);
    768   if (reloc_count < 0)
    769     goto error_return;
    770   if (reloc_count == 0)
    771     goto successful_return;
    772 
    773   /* Get the GP value for the output BFD.  */
    774   gp_undefined = false;
    775   gp = _bfd_get_gp_value (abfd);
    776   if (gp == 0)
    777     {
    778       if (relocatable)
    779 	{
    780 	  asection *sec;
    781 	  bfd_vma lo;
    782 
    783 	  /* Make up a value.  */
    784 	  lo = (bfd_vma) -1;
    785 	  for (sec = abfd->sections; sec != NULL; sec = sec->next)
    786 	    {
    787 	      if (sec->vma < lo
    788 		  && (strcmp (sec->name, ".sbss") == 0
    789 		      || strcmp (sec->name, ".sdata") == 0
    790 		      || strcmp (sec->name, ".lit4") == 0
    791 		      || strcmp (sec->name, ".lit8") == 0
    792 		      || strcmp (sec->name, ".lita") == 0))
    793 		lo = sec->vma;
    794 	    }
    795 	  gp = lo + 0x8000;
    796 	  _bfd_set_gp_value (abfd, gp);
    797 	}
    798       else
    799 	{
    800 	  struct bfd_link_hash_entry *h;
    801 
    802 	  h = bfd_link_hash_lookup (link_info->hash, "_gp", false, false,
    803 				    true);
    804 	  if (h == (struct bfd_link_hash_entry *) NULL
    805 	      || h->type != bfd_link_hash_defined)
    806 	    gp_undefined = true;
    807 	  else
    808 	    {
    809 	      gp = (h->u.def.value
    810 		    + h->u.def.section->output_section->vma
    811 		    + h->u.def.section->output_offset);
    812 	      _bfd_set_gp_value (abfd, gp);
    813 	    }
    814 	}
    815     }
    816 
    817   for (; *reloc_vector != (arelent *) NULL; reloc_vector++)
    818     {
    819       arelent *rel;
    820       bfd_reloc_status_type r;
    821       char *err;
    822 
    823       rel = *reloc_vector;
    824       r = bfd_reloc_ok;
    825       switch (rel->howto->type)
    826 	{
    827 	case ALPHA_R_IGNORE:
    828 	  rel->address += input_section->output_offset;
    829 	  break;
    830 
    831 	case ALPHA_R_REFLONG:
    832 	case ALPHA_R_REFQUAD:
    833 	case ALPHA_R_BRADDR:
    834 	case ALPHA_R_HINT:
    835 	case ALPHA_R_SREL16:
    836 	case ALPHA_R_SREL32:
    837 	case ALPHA_R_SREL64:
    838 	  if (relocatable
    839 	      && ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
    840 	    {
    841 	      rel->address += input_section->output_offset;
    842 	      break;
    843 	    }
    844 	  r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    845 				      output_bfd, &err);
    846 	  break;
    847 
    848 	case ALPHA_R_GPREL32:
    849 	  /* This relocation is used in a switch table.  It is a 32
    850 	     bit offset from the current GP value.  We must adjust it
    851 	     by the different between the original GP value and the
    852 	     current GP value.  The original GP value is stored in the
    853 	     addend.  We adjust the addend and let
    854 	     bfd_perform_relocation finish the job.  */
    855 	  rel->addend -= gp;
    856 	  r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    857 				      output_bfd, &err);
    858 	  if (r == bfd_reloc_ok && gp_undefined)
    859 	    {
    860 	      r = bfd_reloc_dangerous;
    861 	      err = (char *) _("GP relative relocation used when GP not defined");
    862 	    }
    863 	  break;
    864 
    865 	case ALPHA_R_LITERAL:
    866 	  /* This is a reference to a literal value, generally
    867 	     (always?) in the .lita section.  This is a 16 bit GP
    868 	     relative relocation.  Sometimes the subsequent reloc is a
    869 	     LITUSE reloc, which indicates how this reloc is used.
    870 	     This sometimes permits rewriting the two instructions
    871 	     referred to by the LITERAL and the LITUSE into different
    872 	     instructions which do not refer to .lita.  This can save
    873 	     a memory reference, and permits removing a value from
    874 	     .lita thus saving GP relative space.
    875 
    876 	     We do not these optimizations.  To do them we would need
    877 	     to arrange to link the .lita section first, so that by
    878 	     the time we got here we would know the final values to
    879 	     use.  This would not be particularly difficult, but it is
    880 	     not currently implemented.  */
    881 
    882 	  {
    883 	    unsigned long insn;
    884 
    885 	    /* I believe that the LITERAL reloc will only apply to a
    886 	       ldq or ldl instruction, so check my assumption.  */
    887 	    insn = bfd_get_32 (input_bfd, data + rel->address);
    888 	    BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
    889 			|| ((insn >> 26) & 0x3f) == 0x28);
    890 
    891 	    rel->addend -= gp;
    892 	    r = bfd_perform_relocation (input_bfd, rel, data, input_section,
    893 					output_bfd, &err);
    894 	    if (r == bfd_reloc_ok && gp_undefined)
    895 	      {
    896 		r = bfd_reloc_dangerous;
    897 		err =
    898 		  (char *) _("GP relative relocation used when GP not defined");
    899 	      }
    900 	  }
    901 	  break;
    902 
    903 	case ALPHA_R_LITUSE:
    904 	  /* See ALPHA_R_LITERAL above for the uses of this reloc.  It
    905 	     does not cause anything to happen, itself.  */
    906 	  rel->address += input_section->output_offset;
    907 	  break;
    908 
    909 	case ALPHA_R_GPDISP:
    910 	  /* This marks the ldah of an ldah/lda pair which loads the
    911 	     gp register with the difference of the gp value and the
    912 	     current location.  The second of the pair is r_size bytes
    913 	     ahead; it used to be marked with an ALPHA_R_IGNORE reloc,
    914 	     but that no longer happens in OSF/1 3.2.  */
    915 	  {
    916 	    unsigned long insn1, insn2;
    917 	    bfd_vma addend;
    918 
    919 	    /* Get the two instructions.  */
    920 	    insn1 = bfd_get_32 (input_bfd, data + rel->address);
    921 	    insn2 = bfd_get_32 (input_bfd, data + rel->address + rel->addend);
    922 
    923 	    BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
    924 	    BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
    925 
    926 	    /* Get the existing addend.  We must account for the sign
    927 	       extension done by lda and ldah.  */
    928 	    addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
    929 	    if (insn1 & 0x8000)
    930 	      {
    931 		addend -= 0x80000000;
    932 		addend -= 0x80000000;
    933 	      }
    934 	    if (insn2 & 0x8000)
    935 	      addend -= 0x10000;
    936 
    937 	    /* The existing addend includes the different between the
    938 	       gp of the input BFD and the address in the input BFD.
    939 	       Subtract this out.  */
    940 	    addend -= (ecoff_data (input_bfd)->gp
    941 		       - (input_section->vma + rel->address));
    942 
    943 	    /* Now add in the final gp value, and subtract out the
    944 	       final address.  */
    945 	    addend += (gp
    946 		       - (input_section->output_section->vma
    947 			  + input_section->output_offset
    948 			  + rel->address));
    949 
    950 	    /* Change the instructions, accounting for the sign
    951 	       extension, and write them out.  */
    952 	    if (addend & 0x8000)
    953 	      addend += 0x10000;
    954 	    insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
    955 	    insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
    956 
    957 	    bfd_put_32 (input_bfd, (bfd_vma) insn1, data + rel->address);
    958 	    bfd_put_32 (input_bfd, (bfd_vma) insn2,
    959 			data + rel->address + rel->addend);
    960 
    961 	    rel->address += input_section->output_offset;
    962 	  }
    963 	  break;
    964 
    965 	case ALPHA_R_OP_PUSH:
    966 	  /* Push a value on the reloc evaluation stack.  */
    967 	  {
    968 	    asymbol *symbol;
    969 	    bfd_vma relocation;
    970 
    971 	    if (relocatable)
    972 	      {
    973 		rel->address += input_section->output_offset;
    974 		break;
    975 	      }
    976 
    977 	    /* Figure out the relocation of this symbol.  */
    978 	    symbol = *rel->sym_ptr_ptr;
    979 
    980 	    if (bfd_is_und_section (symbol->section))
    981 	      r = bfd_reloc_undefined;
    982 
    983 	    if (bfd_is_com_section (symbol->section))
    984 	      relocation = 0;
    985 	    else
    986 	      relocation = symbol->value;
    987 	    relocation += symbol->section->output_section->vma;
    988 	    relocation += symbol->section->output_offset;
    989 	    relocation += rel->addend;
    990 
    991 	    if (tos >= RELOC_STACKSIZE)
    992 	      abort ();
    993 
    994 	    stack[tos++] = relocation;
    995 	  }
    996 	  break;
    997 
    998 	case ALPHA_R_OP_STORE:
    999 	  /* Store a value from the reloc stack into a bitfield.  */
   1000 	  {
   1001 	    bfd_vma val;
   1002 	    int offset, size;
   1003 
   1004 	    if (relocatable)
   1005 	      {
   1006 		rel->address += input_section->output_offset;
   1007 		break;
   1008 	      }
   1009 
   1010 	    if (tos == 0)
   1011 	      abort ();
   1012 
   1013 	    /* The offset and size for this reloc are encoded into the
   1014 	       addend field by alpha_adjust_reloc_in.  */
   1015 	    offset = (rel->addend >> 8) & 0xff;
   1016 	    size = rel->addend & 0xff;
   1017 
   1018 	    val = bfd_get_64 (abfd, data + rel->address);
   1019 	    val &=~ (((1 << size) - 1) << offset);
   1020 	    val |= (stack[--tos] & ((1 << size) - 1)) << offset;
   1021 	    bfd_put_64 (abfd, val, data + rel->address);
   1022 	  }
   1023 	  break;
   1024 
   1025 	case ALPHA_R_OP_PSUB:
   1026 	  /* Subtract a value from the top of the stack.  */
   1027 	  {
   1028 	    asymbol *symbol;
   1029 	    bfd_vma relocation;
   1030 
   1031 	    if (relocatable)
   1032 	      {
   1033 		rel->address += input_section->output_offset;
   1034 		break;
   1035 	      }
   1036 
   1037 	    /* Figure out the relocation of this symbol.  */
   1038 	    symbol = *rel->sym_ptr_ptr;
   1039 
   1040 	    if (bfd_is_und_section (symbol->section))
   1041 	      r = bfd_reloc_undefined;
   1042 
   1043 	    if (bfd_is_com_section (symbol->section))
   1044 	      relocation = 0;
   1045 	    else
   1046 	      relocation = symbol->value;
   1047 	    relocation += symbol->section->output_section->vma;
   1048 	    relocation += symbol->section->output_offset;
   1049 	    relocation += rel->addend;
   1050 
   1051 	    if (tos == 0)
   1052 	      abort ();
   1053 
   1054 	    stack[tos - 1] -= relocation;
   1055 	  }
   1056 	  break;
   1057 
   1058 	case ALPHA_R_OP_PRSHIFT:
   1059 	  /* Shift the value on the top of the stack.  */
   1060 	  {
   1061 	    asymbol *symbol;
   1062 	    bfd_vma relocation;
   1063 
   1064 	    if (relocatable)
   1065 	      {
   1066 		rel->address += input_section->output_offset;
   1067 		break;
   1068 	      }
   1069 
   1070 	    /* Figure out the relocation of this symbol.  */
   1071 	    symbol = *rel->sym_ptr_ptr;
   1072 
   1073 	    if (bfd_is_und_section (symbol->section))
   1074 	      r = bfd_reloc_undefined;
   1075 
   1076 	    if (bfd_is_com_section (symbol->section))
   1077 	      relocation = 0;
   1078 	    else
   1079 	      relocation = symbol->value;
   1080 	    relocation += symbol->section->output_section->vma;
   1081 	    relocation += symbol->section->output_offset;
   1082 	    relocation += rel->addend;
   1083 
   1084 	    if (tos == 0)
   1085 	      abort ();
   1086 
   1087 	    stack[tos - 1] >>= relocation;
   1088 	  }
   1089 	  break;
   1090 
   1091 	case ALPHA_R_GPVALUE:
   1092 	  /* I really don't know if this does the right thing.  */
   1093 	  gp = rel->addend;
   1094 	  gp_undefined = false;
   1095 	  break;
   1096 
   1097 	default:
   1098 	  abort ();
   1099 	}
   1100 
   1101       if (relocatable)
   1102 	{
   1103 	  asection *os = input_section->output_section;
   1104 
   1105 	  /* A partial link, so keep the relocs.  */
   1106 	  os->orelocation[os->reloc_count] = rel;
   1107 	  os->reloc_count++;
   1108 	}
   1109 
   1110       if (r != bfd_reloc_ok)
   1111 	{
   1112 	  switch (r)
   1113 	    {
   1114 	    case bfd_reloc_undefined:
   1115 	      (*link_info->callbacks->undefined_symbol)
   1116 		(link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
   1117 		 input_bfd, input_section, rel->address, true);
   1118 	      break;
   1119 	    case bfd_reloc_dangerous:
   1120 	      (*link_info->callbacks->reloc_dangerous)
   1121 		(link_info, err, input_bfd, input_section, rel->address);
   1122 	      break;
   1123 	    case bfd_reloc_overflow:
   1124 	      (*link_info->callbacks->reloc_overflow)
   1125 		(link_info, NULL, bfd_asymbol_name (*rel->sym_ptr_ptr),
   1126 		 rel->howto->name, rel->addend, input_bfd,
   1127 		 input_section, rel->address);
   1128 	      break;
   1129 	    case bfd_reloc_outofrange:
   1130 	    default:
   1131 	      abort ();
   1132 	      break;
   1133 	    }
   1134 	}
   1135     }
   1136 
   1137   if (tos != 0)
   1138     abort ();
   1139 
   1140  successful_return:
   1141   free (reloc_vector);
   1142   return data;
   1143 
   1144  error_return:
   1145   free (reloc_vector);
   1146   return NULL;
   1147 }
   1148 
   1149 /* Get the howto structure for a generic reloc type.  */
   1150 
   1151 static reloc_howto_type *
   1152 alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1153 			     bfd_reloc_code_real_type code)
   1154 {
   1155   int alpha_type;
   1156 
   1157   switch (code)
   1158     {
   1159     case BFD_RELOC_32:
   1160       alpha_type = ALPHA_R_REFLONG;
   1161       break;
   1162     case BFD_RELOC_64:
   1163     case BFD_RELOC_CTOR:
   1164       alpha_type = ALPHA_R_REFQUAD;
   1165       break;
   1166     case BFD_RELOC_GPREL32:
   1167       alpha_type = ALPHA_R_GPREL32;
   1168       break;
   1169     case BFD_RELOC_ALPHA_LITERAL:
   1170       alpha_type = ALPHA_R_LITERAL;
   1171       break;
   1172     case BFD_RELOC_ALPHA_LITUSE:
   1173       alpha_type = ALPHA_R_LITUSE;
   1174       break;
   1175     case BFD_RELOC_ALPHA_GPDISP_HI16:
   1176       alpha_type = ALPHA_R_GPDISP;
   1177       break;
   1178     case BFD_RELOC_ALPHA_GPDISP_LO16:
   1179       alpha_type = ALPHA_R_IGNORE;
   1180       break;
   1181     case BFD_RELOC_23_PCREL_S2:
   1182       alpha_type = ALPHA_R_BRADDR;
   1183       break;
   1184     case BFD_RELOC_ALPHA_HINT:
   1185       alpha_type = ALPHA_R_HINT;
   1186       break;
   1187     case BFD_RELOC_16_PCREL:
   1188       alpha_type = ALPHA_R_SREL16;
   1189       break;
   1190     case BFD_RELOC_32_PCREL:
   1191       alpha_type = ALPHA_R_SREL32;
   1192       break;
   1193     case BFD_RELOC_64_PCREL:
   1194       alpha_type = ALPHA_R_SREL64;
   1195       break;
   1196     default:
   1197       return (reloc_howto_type *) NULL;
   1198     }
   1199 
   1200   return &alpha_howto_table[alpha_type];
   1201 }
   1202 
   1203 static reloc_howto_type *
   1204 alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1205 			     const char *r_name)
   1206 {
   1207   unsigned int i;
   1208 
   1209   for (i = 0;
   1210        i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
   1211        i++)
   1212     if (alpha_howto_table[i].name != NULL
   1213 	&& strcasecmp (alpha_howto_table[i].name, r_name) == 0)
   1214       return &alpha_howto_table[i];
   1215 
   1216   return NULL;
   1217 }
   1218 
   1219 /* A helper routine for alpha_relocate_section which converts an
   1221    external reloc when generating relocatable output.  Returns the
   1222    relocation amount.  */
   1223 
   1224 static bfd_vma
   1225 alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
   1226 			      struct bfd_link_info *info,
   1227 			      bfd *input_bfd,
   1228 			      struct external_reloc *ext_rel,
   1229 			      struct ecoff_link_hash_entry *h)
   1230 {
   1231   unsigned long r_symndx;
   1232   bfd_vma relocation;
   1233 
   1234   BFD_ASSERT (bfd_link_relocatable (info));
   1235 
   1236   if (h->root.type == bfd_link_hash_defined
   1237       || h->root.type == bfd_link_hash_defweak)
   1238     {
   1239       asection *hsec;
   1240       const char *name;
   1241 
   1242       /* This symbol is defined in the output.  Convert the reloc from
   1243 	 being against the symbol to being against the section.  */
   1244 
   1245       /* Clear the r_extern bit.  */
   1246       ext_rel->r_bits[1] &=~ RELOC_BITS1_EXTERN_LITTLE;
   1247 
   1248       /* Compute a new r_symndx value.  */
   1249       hsec = h->root.u.def.section;
   1250       name = bfd_section_name (hsec->output_section);
   1251 
   1252       r_symndx = (unsigned long) -1;
   1253       switch (name[1])
   1254 	{
   1255 	case 'A':
   1256 	  if (strcmp (name, "*ABS*") == 0)
   1257 	    r_symndx = RELOC_SECTION_ABS;
   1258 	  break;
   1259 	case 'b':
   1260 	  if (strcmp (name, ".bss") == 0)
   1261 	    r_symndx = RELOC_SECTION_BSS;
   1262 	  break;
   1263 	case 'd':
   1264 	  if (strcmp (name, ".data") == 0)
   1265 	    r_symndx = RELOC_SECTION_DATA;
   1266 	  break;
   1267 	case 'f':
   1268 	  if (strcmp (name, ".fini") == 0)
   1269 	    r_symndx = RELOC_SECTION_FINI;
   1270 	  break;
   1271 	case 'i':
   1272 	  if (strcmp (name, ".init") == 0)
   1273 	    r_symndx = RELOC_SECTION_INIT;
   1274 	  break;
   1275 	case 'l':
   1276 	  if (strcmp (name, ".lita") == 0)
   1277 	    r_symndx = RELOC_SECTION_LITA;
   1278 	  else if (strcmp (name, ".lit8") == 0)
   1279 	    r_symndx = RELOC_SECTION_LIT8;
   1280 	  else if (strcmp (name, ".lit4") == 0)
   1281 	    r_symndx = RELOC_SECTION_LIT4;
   1282 	  break;
   1283 	case 'p':
   1284 	  if (strcmp (name, ".pdata") == 0)
   1285 	    r_symndx = RELOC_SECTION_PDATA;
   1286 	  break;
   1287 	case 'r':
   1288 	  if (strcmp (name, ".rdata") == 0)
   1289 	    r_symndx = RELOC_SECTION_RDATA;
   1290 	  else if (strcmp (name, ".rconst") == 0)
   1291 	    r_symndx = RELOC_SECTION_RCONST;
   1292 	  break;
   1293 	case 's':
   1294 	  if (strcmp (name, ".sdata") == 0)
   1295 	    r_symndx = RELOC_SECTION_SDATA;
   1296 	  else if (strcmp (name, ".sbss") == 0)
   1297 	    r_symndx = RELOC_SECTION_SBSS;
   1298 	  break;
   1299 	case 't':
   1300 	  if (strcmp (name, ".text") == 0)
   1301 	    r_symndx = RELOC_SECTION_TEXT;
   1302 	  break;
   1303 	case 'x':
   1304 	  if (strcmp (name, ".xdata") == 0)
   1305 	    r_symndx = RELOC_SECTION_XDATA;
   1306 	  break;
   1307 	}
   1308 
   1309       if (r_symndx == (unsigned long) -1)
   1310 	abort ();
   1311 
   1312       /* Add the section VMA and the symbol value.  */
   1313       relocation = (h->root.u.def.value
   1314 		    + hsec->output_section->vma
   1315 		    + hsec->output_offset);
   1316     }
   1317   else
   1318     {
   1319       /* Change the symndx value to the right one for
   1320 	 the output BFD.  */
   1321       r_symndx = h->indx;
   1322       if (r_symndx == (unsigned long) -1)
   1323 	{
   1324 	  /* Caller must give an error.  */
   1325 	  r_symndx = 0;
   1326 	}
   1327       relocation = 0;
   1328     }
   1329 
   1330   /* Write out the new r_symndx value.  */
   1331   H_PUT_32 (input_bfd, r_symndx, ext_rel->r_symndx);
   1332 
   1333   return relocation;
   1334 }
   1335 
   1336 /* Relocate a section while linking an Alpha ECOFF file.  This is
   1337    quite similar to get_relocated_section_contents.  Perhaps they
   1338    could be combined somehow.  */
   1339 
   1340 static bool
   1341 alpha_relocate_section (bfd *output_bfd,
   1342 			struct bfd_link_info *info,
   1343 			bfd *input_bfd,
   1344 			asection *input_section,
   1345 			bfd_byte *contents,
   1346 			void * external_relocs)
   1347 {
   1348   asection **symndx_to_section, *lita_sec;
   1349   struct ecoff_link_hash_entry **sym_hashes;
   1350   bfd_vma gp;
   1351   bool gp_undefined;
   1352   bfd_vma stack[RELOC_STACKSIZE];
   1353   int tos = 0;
   1354   struct external_reloc *ext_rel;
   1355   struct external_reloc *ext_rel_end;
   1356   bfd_size_type amt;
   1357 
   1358   /* We keep a table mapping the symndx found in an internal reloc to
   1359      the appropriate section.  This is faster than looking up the
   1360      section by name each time.  */
   1361   symndx_to_section = ecoff_data (input_bfd)->symndx_to_section;
   1362   if (symndx_to_section == (asection **) NULL)
   1363     {
   1364       amt = NUM_RELOC_SECTIONS * sizeof (asection *);
   1365       symndx_to_section = (asection **) bfd_alloc (input_bfd, amt);
   1366       if (!symndx_to_section)
   1367 	return false;
   1368 
   1369       symndx_to_section[RELOC_SECTION_NONE] = NULL;
   1370       symndx_to_section[RELOC_SECTION_TEXT] =
   1371 	bfd_get_section_by_name (input_bfd, ".text");
   1372       symndx_to_section[RELOC_SECTION_RDATA] =
   1373 	bfd_get_section_by_name (input_bfd, ".rdata");
   1374       symndx_to_section[RELOC_SECTION_DATA] =
   1375 	bfd_get_section_by_name (input_bfd, ".data");
   1376       symndx_to_section[RELOC_SECTION_SDATA] =
   1377 	bfd_get_section_by_name (input_bfd, ".sdata");
   1378       symndx_to_section[RELOC_SECTION_SBSS] =
   1379 	bfd_get_section_by_name (input_bfd, ".sbss");
   1380       symndx_to_section[RELOC_SECTION_BSS] =
   1381 	bfd_get_section_by_name (input_bfd, ".bss");
   1382       symndx_to_section[RELOC_SECTION_INIT] =
   1383 	bfd_get_section_by_name (input_bfd, ".init");
   1384       symndx_to_section[RELOC_SECTION_LIT8] =
   1385 	bfd_get_section_by_name (input_bfd, ".lit8");
   1386       symndx_to_section[RELOC_SECTION_LIT4] =
   1387 	bfd_get_section_by_name (input_bfd, ".lit4");
   1388       symndx_to_section[RELOC_SECTION_XDATA] =
   1389 	bfd_get_section_by_name (input_bfd, ".xdata");
   1390       symndx_to_section[RELOC_SECTION_PDATA] =
   1391 	bfd_get_section_by_name (input_bfd, ".pdata");
   1392       symndx_to_section[RELOC_SECTION_FINI] =
   1393 	bfd_get_section_by_name (input_bfd, ".fini");
   1394       symndx_to_section[RELOC_SECTION_LITA] =
   1395 	bfd_get_section_by_name (input_bfd, ".lita");
   1396       symndx_to_section[RELOC_SECTION_ABS] = bfd_abs_section_ptr;
   1397       symndx_to_section[RELOC_SECTION_RCONST] =
   1398 	bfd_get_section_by_name (input_bfd, ".rconst");
   1399 
   1400       ecoff_data (input_bfd)->symndx_to_section = symndx_to_section;
   1401     }
   1402 
   1403   sym_hashes = ecoff_data (input_bfd)->sym_hashes;
   1404 
   1405   /* On the Alpha, the .lita section must be addressable by the global
   1406      pointer.  To support large programs, we need to allow multiple
   1407      global pointers.  This works as long as each input .lita section
   1408      is <64KB big.  This implies that when producing relocatable
   1409      output, the .lita section is limited to 64KB. .  */
   1410 
   1411   lita_sec = symndx_to_section[RELOC_SECTION_LITA];
   1412   gp = _bfd_get_gp_value (output_bfd);
   1413   if (! bfd_link_relocatable (info) && lita_sec != NULL)
   1414     {
   1415       struct ecoff_section_tdata *lita_sec_data;
   1416 
   1417       /* Make sure we have a section data structure to which we can
   1418 	 hang on to the gp value we pick for the section.  */
   1419       lita_sec_data = ecoff_section_data (input_bfd, lita_sec);
   1420       if (lita_sec_data == NULL)
   1421 	{
   1422 	  amt = sizeof (struct ecoff_section_tdata);
   1423 	  lita_sec_data = ((struct ecoff_section_tdata *)
   1424 			   bfd_zalloc (input_bfd, amt));
   1425 	  lita_sec->used_by_bfd = lita_sec_data;
   1426 	}
   1427 
   1428       if (lita_sec_data->gp != 0)
   1429 	{
   1430 	  /* If we already assigned a gp to this section, we better
   1431 	     stick with that value.  */
   1432 	  gp = lita_sec_data->gp;
   1433 	}
   1434       else
   1435 	{
   1436 	  bfd_vma lita_vma;
   1437 	  bfd_size_type lita_size;
   1438 
   1439 	  lita_vma = lita_sec->output_offset + lita_sec->output_section->vma;
   1440 	  lita_size = lita_sec->size;
   1441 
   1442 	  if (gp == 0
   1443 	      || lita_vma <  gp - 0x8000
   1444 	      || lita_vma + lita_size >= gp + 0x8000)
   1445 	    {
   1446 	      /* Either gp hasn't been set at all or the current gp
   1447 		 cannot address this .lita section.  In both cases we
   1448 		 reset the gp to point into the "middle" of the
   1449 		 current input .lita section.  */
   1450 	      if (gp && !ecoff_data (output_bfd)->issued_multiple_gp_warning)
   1451 		{
   1452 		  (*info->callbacks->warning) (info,
   1453 					       _("using multiple gp values"),
   1454 					       (char *) NULL, output_bfd,
   1455 					       (asection *) NULL, (bfd_vma) 0);
   1456 		  ecoff_data (output_bfd)->issued_multiple_gp_warning = true;
   1457 		}
   1458 	      if (lita_vma < gp - 0x8000)
   1459 		gp = lita_vma + lita_size - 0x8000;
   1460 	      else
   1461 		gp = lita_vma + 0x8000;
   1462 
   1463 	    }
   1464 
   1465 	  lita_sec_data->gp = gp;
   1466 	}
   1467 
   1468       _bfd_set_gp_value (output_bfd, gp);
   1469     }
   1470 
   1471   gp_undefined = (gp == 0);
   1472 
   1473   BFD_ASSERT (bfd_header_little_endian (output_bfd));
   1474   BFD_ASSERT (bfd_header_little_endian (input_bfd));
   1475 
   1476   ext_rel = (struct external_reloc *) external_relocs;
   1477   ext_rel_end = ext_rel + input_section->reloc_count;
   1478   for (; ext_rel < ext_rel_end; ext_rel++)
   1479     {
   1480       bfd_vma r_vaddr;
   1481       unsigned long r_symndx;
   1482       int r_type;
   1483       int r_extern;
   1484       int r_offset;
   1485       int r_size;
   1486       bool relocatep;
   1487       bool adjust_addrp;
   1488       bool gp_usedp;
   1489       bfd_vma addend;
   1490 
   1491       r_vaddr = H_GET_64 (input_bfd, ext_rel->r_vaddr);
   1492       r_symndx = H_GET_32 (input_bfd, ext_rel->r_symndx);
   1493 
   1494       r_type = ((ext_rel->r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
   1495 		>> RELOC_BITS0_TYPE_SH_LITTLE);
   1496       r_extern = (ext_rel->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
   1497       r_offset = ((ext_rel->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
   1498 		  >> RELOC_BITS1_OFFSET_SH_LITTLE);
   1499       /* Ignored the reserved bits.  */
   1500       r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
   1501 		>> RELOC_BITS3_SIZE_SH_LITTLE);
   1502 
   1503       relocatep = false;
   1504       adjust_addrp = true;
   1505       gp_usedp = false;
   1506       addend = 0;
   1507 
   1508       switch (r_type)
   1509 	{
   1510 	case ALPHA_R_GPRELHIGH:
   1511 	  _bfd_error_handler (_("%pB: %s unsupported"),
   1512 			      input_bfd, "ALPHA_R_GPRELHIGH");
   1513 	  bfd_set_error (bfd_error_bad_value);
   1514 	  continue;
   1515 
   1516 	case ALPHA_R_GPRELLOW:
   1517 	  _bfd_error_handler (_("%pB: %s unsupported"),
   1518 			      input_bfd, "ALPHA_R_GPRELLOW");
   1519 	  bfd_set_error (bfd_error_bad_value);
   1520 	  continue;
   1521 
   1522 	default:
   1523 	  /* xgettext:c-format */
   1524 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   1525 			      input_bfd, (int) r_type);
   1526 	  bfd_set_error (bfd_error_bad_value);
   1527 	  continue;
   1528 
   1529 	case ALPHA_R_IGNORE:
   1530 	  /* This reloc appears after a GPDISP reloc.  On earlier
   1531 	     versions of OSF/1, It marked the position of the second
   1532 	     instruction to be altered by the GPDISP reloc, but it is
   1533 	     not otherwise used for anything.  For some reason, the
   1534 	     address of the relocation does not appear to include the
   1535 	     section VMA, unlike the other relocation types.  */
   1536 	  if (bfd_link_relocatable (info))
   1537 	    H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
   1538 		      ext_rel->r_vaddr);
   1539 	  adjust_addrp = false;
   1540 	  break;
   1541 
   1542 	case ALPHA_R_REFLONG:
   1543 	case ALPHA_R_REFQUAD:
   1544 	case ALPHA_R_HINT:
   1545 	  relocatep = true;
   1546 	  break;
   1547 
   1548 	case ALPHA_R_BRADDR:
   1549 	case ALPHA_R_SREL16:
   1550 	case ALPHA_R_SREL32:
   1551 	case ALPHA_R_SREL64:
   1552 	  if (r_extern)
   1553 	    addend += - (r_vaddr + 4);
   1554 	  relocatep = true;
   1555 	  break;
   1556 
   1557 	case ALPHA_R_GPREL32:
   1558 	  /* This relocation is used in a switch table.  It is a 32
   1559 	     bit offset from the current GP value.  We must adjust it
   1560 	     by the different between the original GP value and the
   1561 	     current GP value.  */
   1562 	  relocatep = true;
   1563 	  addend = ecoff_data (input_bfd)->gp - gp;
   1564 	  gp_usedp = true;
   1565 	  break;
   1566 
   1567 	case ALPHA_R_LITERAL:
   1568 	  /* This is a reference to a literal value, generally
   1569 	     (always?) in the .lita section.  This is a 16 bit GP
   1570 	     relative relocation.  Sometimes the subsequent reloc is a
   1571 	     LITUSE reloc, which indicates how this reloc is used.
   1572 	     This sometimes permits rewriting the two instructions
   1573 	     referred to by the LITERAL and the LITUSE into different
   1574 	     instructions which do not refer to .lita.  This can save
   1575 	     a memory reference, and permits removing a value from
   1576 	     .lita thus saving GP relative space.
   1577 
   1578 	     We do not these optimizations.  To do them we would need
   1579 	     to arrange to link the .lita section first, so that by
   1580 	     the time we got here we would know the final values to
   1581 	     use.  This would not be particularly difficult, but it is
   1582 	     not currently implemented.  */
   1583 
   1584 	  /* I believe that the LITERAL reloc will only apply to a ldq
   1585 	     or ldl instruction, so check my assumption.  */
   1586 	  {
   1587 	    unsigned long insn;
   1588 
   1589 	    insn = bfd_get_32 (input_bfd,
   1590 			       contents + r_vaddr - input_section->vma);
   1591 	    BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
   1592 			|| ((insn >> 26) & 0x3f) == 0x28);
   1593 	  }
   1594 
   1595 	  relocatep = true;
   1596 	  addend = ecoff_data (input_bfd)->gp - gp;
   1597 	  gp_usedp = true;
   1598 	  break;
   1599 
   1600 	case ALPHA_R_LITUSE:
   1601 	  /* See ALPHA_R_LITERAL above for the uses of this reloc.  It
   1602 	     does not cause anything to happen, itself.  */
   1603 	  break;
   1604 
   1605 	case ALPHA_R_GPDISP:
   1606 	  /* This marks the ldah of an ldah/lda pair which loads the
   1607 	     gp register with the difference of the gp value and the
   1608 	     current location.  The second of the pair is r_symndx
   1609 	     bytes ahead.  It used to be marked with an ALPHA_R_IGNORE
   1610 	     reloc, but OSF/1 3.2 no longer does that.  */
   1611 	  {
   1612 	    unsigned long insn1, insn2;
   1613 
   1614 	    /* Get the two instructions.  */
   1615 	    insn1 = bfd_get_32 (input_bfd,
   1616 				contents + r_vaddr - input_section->vma);
   1617 	    insn2 = bfd_get_32 (input_bfd,
   1618 				(contents
   1619 				 + r_vaddr
   1620 				 - input_section->vma
   1621 				 + r_symndx));
   1622 
   1623 	    BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
   1624 	    BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
   1625 
   1626 	    /* Get the existing addend.  We must account for the sign
   1627 	       extension done by lda and ldah.  */
   1628 	    addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
   1629 	    if (insn1 & 0x8000)
   1630 	      {
   1631 		/* This is addend -= 0x100000000 without causing an
   1632 		   integer overflow on a 32 bit host.  */
   1633 		addend -= 0x80000000;
   1634 		addend -= 0x80000000;
   1635 	      }
   1636 	    if (insn2 & 0x8000)
   1637 	      addend -= 0x10000;
   1638 
   1639 	    /* The existing addend includes the difference between the
   1640 	       gp of the input BFD and the address in the input BFD.
   1641 	       We want to change this to the difference between the
   1642 	       final GP and the final address.  */
   1643 	    addend += (gp
   1644 		       - ecoff_data (input_bfd)->gp
   1645 		       + input_section->vma
   1646 		       - (input_section->output_section->vma
   1647 			  + input_section->output_offset));
   1648 
   1649 	    /* Change the instructions, accounting for the sign
   1650 	       extension, and write them out.  */
   1651 	    if (addend & 0x8000)
   1652 	      addend += 0x10000;
   1653 	    insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
   1654 	    insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
   1655 
   1656 	    bfd_put_32 (input_bfd, (bfd_vma) insn1,
   1657 			contents + r_vaddr - input_section->vma);
   1658 	    bfd_put_32 (input_bfd, (bfd_vma) insn2,
   1659 			contents + r_vaddr - input_section->vma + r_symndx);
   1660 
   1661 	    gp_usedp = true;
   1662 	  }
   1663 	  break;
   1664 
   1665 	case ALPHA_R_OP_PUSH:
   1666 	case ALPHA_R_OP_PSUB:
   1667 	case ALPHA_R_OP_PRSHIFT:
   1668 	  /* Manipulate values on the reloc evaluation stack.  The
   1669 	     r_vaddr field is not an address in input_section, it is
   1670 	     the current value (including any addend) of the object
   1671 	     being used.  */
   1672 	  if (! r_extern)
   1673 	    {
   1674 	      asection *s;
   1675 
   1676 	      s = symndx_to_section[r_symndx];
   1677 	      if (s == (asection *) NULL)
   1678 		abort ();
   1679 	      addend = s->output_section->vma + s->output_offset - s->vma;
   1680 	    }
   1681 	  else
   1682 	    {
   1683 	      struct ecoff_link_hash_entry *h;
   1684 
   1685 	      h = sym_hashes[r_symndx];
   1686 	      if (h == (struct ecoff_link_hash_entry *) NULL)
   1687 		abort ();
   1688 
   1689 	      if (! bfd_link_relocatable (info))
   1690 		{
   1691 		  if (h->root.type == bfd_link_hash_defined
   1692 		      || h->root.type == bfd_link_hash_defweak)
   1693 		    addend = (h->root.u.def.value
   1694 			      + h->root.u.def.section->output_section->vma
   1695 			      + h->root.u.def.section->output_offset);
   1696 		  else
   1697 		    {
   1698 		      /* Note that we pass the address as 0, since we
   1699 			 do not have a meaningful number for the
   1700 			 location within the section that is being
   1701 			 relocated.  */
   1702 		      (*info->callbacks->undefined_symbol)
   1703 			(info, h->root.root.string, input_bfd,
   1704 			 input_section, (bfd_vma) 0, true);
   1705 		      addend = 0;
   1706 		    }
   1707 		}
   1708 	      else
   1709 		{
   1710 		  if (h->root.type != bfd_link_hash_defined
   1711 		      && h->root.type != bfd_link_hash_defweak
   1712 		      && h->indx == -1)
   1713 		    {
   1714 		      /* This symbol is not being written out.  Pass
   1715 			 the address as 0, as with undefined_symbol,
   1716 			 above.  */
   1717 		      (*info->callbacks->unattached_reloc)
   1718 			(info, h->root.root.string,
   1719 			 input_bfd, input_section, (bfd_vma) 0);
   1720 		    }
   1721 
   1722 		  addend = alpha_convert_external_reloc (output_bfd, info,
   1723 							 input_bfd,
   1724 							 ext_rel, h);
   1725 		}
   1726 	    }
   1727 
   1728 	  addend += r_vaddr;
   1729 
   1730 	  if (bfd_link_relocatable (info))
   1731 	    {
   1732 	      /* Adjust r_vaddr by the addend.  */
   1733 	      H_PUT_64 (input_bfd, addend, ext_rel->r_vaddr);
   1734 	    }
   1735 	  else
   1736 	    {
   1737 	      switch (r_type)
   1738 		{
   1739 		case ALPHA_R_OP_PUSH:
   1740 		  if (tos >= RELOC_STACKSIZE)
   1741 		    abort ();
   1742 		  stack[tos++] = addend;
   1743 		  break;
   1744 
   1745 		case ALPHA_R_OP_PSUB:
   1746 		  if (tos == 0)
   1747 		    abort ();
   1748 		  stack[tos - 1] -= addend;
   1749 		  break;
   1750 
   1751 		case ALPHA_R_OP_PRSHIFT:
   1752 		  if (tos == 0)
   1753 		    abort ();
   1754 		  stack[tos - 1] >>= addend;
   1755 		  break;
   1756 		}
   1757 	    }
   1758 
   1759 	  adjust_addrp = false;
   1760 	  break;
   1761 
   1762 	case ALPHA_R_OP_STORE:
   1763 	  /* Store a value from the reloc stack into a bitfield.  If
   1764 	     we are generating relocatable output, all we do is
   1765 	     adjust the address of the reloc.  */
   1766 	  if (! bfd_link_relocatable (info))
   1767 	    {
   1768 	      bfd_vma mask;
   1769 	      bfd_vma val;
   1770 
   1771 	      if (tos == 0)
   1772 		abort ();
   1773 
   1774 	      /* Get the relocation mask.  The separate steps and the
   1775 		 casts to bfd_vma are attempts to avoid a bug in the
   1776 		 Alpha OSF 1.3 C compiler.  See reloc.c for more
   1777 		 details.  */
   1778 	      mask = 1;
   1779 	      mask <<= (bfd_vma) r_size;
   1780 	      mask -= 1;
   1781 
   1782 	      /* FIXME: I don't know what kind of overflow checking,
   1783 		 if any, should be done here.  */
   1784 	      val = bfd_get_64 (input_bfd,
   1785 				contents + r_vaddr - input_section->vma);
   1786 	      val &=~ mask << (bfd_vma) r_offset;
   1787 	      val |= (stack[--tos] & mask) << (bfd_vma) r_offset;
   1788 	      bfd_put_64 (input_bfd, val,
   1789 			  contents + r_vaddr - input_section->vma);
   1790 	    }
   1791 	  break;
   1792 
   1793 	case ALPHA_R_GPVALUE:
   1794 	  /* I really don't know if this does the right thing.  */
   1795 	  gp = ecoff_data (input_bfd)->gp + r_symndx;
   1796 	  gp_undefined = false;
   1797 	  break;
   1798 	}
   1799 
   1800       if (relocatep)
   1801 	{
   1802 	  reloc_howto_type *howto;
   1803 	  struct ecoff_link_hash_entry *h = NULL;
   1804 	  asection *s = NULL;
   1805 	  bfd_vma relocation;
   1806 	  bfd_reloc_status_type r;
   1807 
   1808 	  /* Perform a relocation.  */
   1809 
   1810 	  howto = &alpha_howto_table[r_type];
   1811 
   1812 	  if (r_extern)
   1813 	    {
   1814 	      h = sym_hashes[r_symndx];
   1815 	      /* If h is NULL, that means that there is a reloc
   1816 		 against an external symbol which we thought was just
   1817 		 a debugging symbol.  This should not happen.  */
   1818 	      if (h == (struct ecoff_link_hash_entry *) NULL)
   1819 		abort ();
   1820 	    }
   1821 	  else
   1822 	    {
   1823 	      if (r_symndx >= NUM_RELOC_SECTIONS)
   1824 		s = NULL;
   1825 	      else
   1826 		s = symndx_to_section[r_symndx];
   1827 
   1828 	      if (s == (asection *) NULL)
   1829 		abort ();
   1830 	    }
   1831 
   1832 	  if (bfd_link_relocatable (info))
   1833 	    {
   1834 	      /* We are generating relocatable output, and must
   1835 		 convert the existing reloc.  */
   1836 	      if (r_extern)
   1837 		{
   1838 		  if (h->root.type != bfd_link_hash_defined
   1839 		      && h->root.type != bfd_link_hash_defweak
   1840 		      && h->indx == -1)
   1841 		    {
   1842 		      /* This symbol is not being written out.  */
   1843 		      (*info->callbacks->unattached_reloc)
   1844 			(info, h->root.root.string, input_bfd,
   1845 			 input_section, r_vaddr - input_section->vma);
   1846 		    }
   1847 
   1848 		  relocation = alpha_convert_external_reloc (output_bfd,
   1849 							     info,
   1850 							     input_bfd,
   1851 							     ext_rel,
   1852 							     h);
   1853 		}
   1854 	      else
   1855 		{
   1856 		  /* This is a relocation against a section.  Adjust
   1857 		     the value by the amount the section moved.  */
   1858 		  relocation = (s->output_section->vma
   1859 				+ s->output_offset
   1860 				- s->vma);
   1861 		}
   1862 
   1863 	      /* If this is PC relative, the existing object file
   1864 		 appears to already have the reloc worked out.  We
   1865 		 must subtract out the old value and add in the new
   1866 		 one.  */
   1867 	      if (howto->pc_relative)
   1868 		relocation -= (input_section->output_section->vma
   1869 			       + input_section->output_offset
   1870 			       - input_section->vma);
   1871 
   1872 	      /* Put in any addend.  */
   1873 	      relocation += addend;
   1874 
   1875 	      /* Adjust the contents.  */
   1876 	      r = _bfd_relocate_contents (howto, input_bfd, relocation,
   1877 					  (contents
   1878 					   + r_vaddr
   1879 					   - input_section->vma));
   1880 	    }
   1881 	  else
   1882 	    {
   1883 	      /* We are producing a final executable.  */
   1884 	      if (r_extern)
   1885 		{
   1886 		  /* This is a reloc against a symbol.  */
   1887 		  if (h->root.type == bfd_link_hash_defined
   1888 		      || h->root.type == bfd_link_hash_defweak)
   1889 		    {
   1890 		      asection *hsec;
   1891 
   1892 		      hsec = h->root.u.def.section;
   1893 		      relocation = (h->root.u.def.value
   1894 				    + hsec->output_section->vma
   1895 				    + hsec->output_offset);
   1896 		    }
   1897 		  else
   1898 		    {
   1899 		      (*info->callbacks->undefined_symbol)
   1900 			(info, h->root.root.string, input_bfd, input_section,
   1901 			 r_vaddr - input_section->vma, true);
   1902 		      relocation = 0;
   1903 		    }
   1904 		}
   1905 	      else
   1906 		{
   1907 		  /* This is a reloc against a section.  */
   1908 		  relocation = (s->output_section->vma
   1909 				+ s->output_offset
   1910 				- s->vma);
   1911 
   1912 		  /* Adjust a PC relative relocation by removing the
   1913 		     reference to the original source section.  */
   1914 		  if (howto->pc_relative)
   1915 		    relocation += input_section->vma;
   1916 		}
   1917 
   1918 	      r = _bfd_final_link_relocate (howto,
   1919 					    input_bfd,
   1920 					    input_section,
   1921 					    contents,
   1922 					    r_vaddr - input_section->vma,
   1923 					    relocation,
   1924 					    addend);
   1925 	    }
   1926 
   1927 	  if (r != bfd_reloc_ok)
   1928 	    {
   1929 	      switch (r)
   1930 		{
   1931 		default:
   1932 		case bfd_reloc_outofrange:
   1933 		  abort ();
   1934 		case bfd_reloc_overflow:
   1935 		  {
   1936 		    const char *name;
   1937 
   1938 		    if (r_extern)
   1939 		      name = sym_hashes[r_symndx]->root.root.string;
   1940 		    else
   1941 		      name = bfd_section_name (symndx_to_section[r_symndx]);
   1942 		    (*info->callbacks->reloc_overflow)
   1943 		      (info, NULL, name, alpha_howto_table[r_type].name,
   1944 		       (bfd_vma) 0, input_bfd, input_section,
   1945 		       r_vaddr - input_section->vma);
   1946 		  }
   1947 		  break;
   1948 		}
   1949 	    }
   1950 	}
   1951 
   1952       if (bfd_link_relocatable (info) && adjust_addrp)
   1953 	{
   1954 	  /* Change the address of the relocation.  */
   1955 	  H_PUT_64 (input_bfd,
   1956 		    (input_section->output_section->vma
   1957 		     + input_section->output_offset
   1958 		     - input_section->vma
   1959 		     + r_vaddr),
   1960 		    ext_rel->r_vaddr);
   1961 	}
   1962 
   1963       if (gp_usedp && gp_undefined)
   1964 	{
   1965 	  (*info->callbacks->reloc_dangerous)
   1966 	    (info, _("GP relative relocation used when GP not defined"),
   1967 	     input_bfd, input_section, r_vaddr - input_section->vma);
   1968 	  /* Only give the error once per link.  */
   1969 	  gp = 4;
   1970 	  _bfd_set_gp_value (output_bfd, gp);
   1971 	  gp_undefined = false;
   1972 	}
   1973     }
   1974 
   1975   if (tos != 0)
   1976     abort ();
   1977 
   1978   return true;
   1979 }
   1980 
   1981 /* Do final adjustments to the filehdr and the aouthdr.  This routine
   1983    sets the dynamic bits in the file header.  */
   1984 
   1985 static bool
   1986 alpha_adjust_headers (bfd *abfd,
   1987 		      struct internal_filehdr *fhdr,
   1988 		      struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED)
   1989 {
   1990   if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P))
   1991     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
   1992   else if ((abfd->flags & DYNAMIC) != 0)
   1993     fhdr->f_flags |= F_ALPHA_SHARABLE;
   1994   return true;
   1995 }
   1996 
   1997 /* Archive handling.  In OSF/1 (or Digital Unix) v3.2, Digital
   1999    introduced archive packing, in which the elements in an archive are
   2000    optionally compressed using a simple dictionary scheme.  We know
   2001    how to read such archives, but we don't write them.  */
   2002 
   2003 #define alpha_ecoff_slurp_armap _bfd_ecoff_slurp_armap
   2004 #define alpha_ecoff_slurp_extended_name_table \
   2005   _bfd_ecoff_slurp_extended_name_table
   2006 #define alpha_ecoff_construct_extended_name_table \
   2007   _bfd_ecoff_construct_extended_name_table
   2008 #define alpha_ecoff_truncate_arname _bfd_ecoff_truncate_arname
   2009 #define alpha_ecoff_write_armap _bfd_ecoff_write_armap
   2010 #define alpha_ecoff_write_ar_hdr _bfd_generic_write_ar_hdr
   2011 #define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt
   2012 #define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp
   2013 
   2014 /* A compressed file uses this instead of ARFMAG.  */
   2015 
   2016 #define ARFZMAG "Z\012"
   2017 
   2018 /* Read an archive header.  This is like the standard routine, but it
   2019    also accepts ARFZMAG.  */
   2020 
   2021 static void *
   2022 alpha_ecoff_read_ar_hdr (bfd *abfd)
   2023 {
   2024   struct areltdata *ret;
   2025   struct ar_hdr *h;
   2026 
   2027   ret = (struct areltdata *) _bfd_generic_read_ar_hdr_mag (abfd, ARFZMAG);
   2028   if (ret == NULL)
   2029     return NULL;
   2030 
   2031   h = (struct ar_hdr *) ret->arch_header;
   2032   if (strncmp (h->ar_fmag, ARFZMAG, 2) == 0)
   2033     {
   2034       bfd_byte ab[8];
   2035 
   2036       /* This is a compressed file.  We must set the size correctly.
   2037 	 The size is the eight bytes after the dummy file header.  */
   2038       if (bfd_seek (abfd, (file_ptr) FILHSZ, SEEK_CUR) != 0
   2039 	  || bfd_bread (ab, (bfd_size_type) 8, abfd) != 8
   2040 	  || bfd_seek (abfd, (file_ptr) (- (FILHSZ + 8)), SEEK_CUR) != 0)
   2041 	{
   2042 	  free (ret);
   2043 	  return NULL;
   2044 	}
   2045 
   2046       ret->parsed_size = H_GET_64 (abfd, ab);
   2047     }
   2048 
   2049   return ret;
   2050 }
   2051 
   2052 /* Get an archive element at a specified file position.  This is where
   2053    we uncompress the archive element if necessary.  */
   2054 
   2055 static bfd *
   2056 alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos,
   2057 				struct bfd_link_info *info)
   2058 {
   2059   bfd *nbfd = NULL;
   2060   struct areltdata *tdata;
   2061   struct ar_hdr *hdr;
   2062   bfd_byte ab[8];
   2063   bfd_size_type size;
   2064   bfd_byte *buf, *p;
   2065   struct bfd_in_memory *bim;
   2066   ufile_ptr filesize;
   2067 
   2068   buf = NULL;
   2069   nbfd = _bfd_get_elt_at_filepos (archive, filepos, info);
   2070   if (nbfd == NULL)
   2071     goto error_return;
   2072 
   2073   if ((nbfd->flags & BFD_IN_MEMORY) != 0)
   2074     {
   2075       /* We have already expanded this BFD.  */
   2076       return nbfd;
   2077     }
   2078 
   2079   tdata = (struct areltdata *) nbfd->arelt_data;
   2080   hdr = (struct ar_hdr *) tdata->arch_header;
   2081   if (strncmp (hdr->ar_fmag, ARFZMAG, 2) != 0)
   2082     return nbfd;
   2083 
   2084   /* We must uncompress this element.  We do this by copying it into a
   2085      memory buffer, and making bfd_bread and bfd_seek use that buffer.
   2086      This can use a lot of memory, but it's simpler than getting a
   2087      temporary file, making that work with the file descriptor caching
   2088      code, and making sure that it is deleted at all appropriate
   2089      times.  It can be changed if it ever becomes important.  */
   2090 
   2091   /* The compressed file starts with a dummy ECOFF file header.  */
   2092   if (bfd_seek (nbfd, (file_ptr) FILHSZ, SEEK_SET) != 0)
   2093     goto error_return;
   2094 
   2095   /* The next eight bytes are the real file size.  */
   2096   if (bfd_bread (ab, (bfd_size_type) 8, nbfd) != 8)
   2097     goto error_return;
   2098   size = H_GET_64 (nbfd, ab);
   2099 
   2100   /* The decompression algorithm will at most expand by eight times.  */
   2101   filesize = bfd_get_file_size (archive);
   2102   if (filesize != 0 && size / 8 > filesize)
   2103     {
   2104       bfd_set_error (bfd_error_malformed_archive);
   2105       goto error_return;
   2106     }
   2107 
   2108   if (size != 0)
   2109     {
   2110       bfd_size_type left;
   2111       bfd_byte dict[4096];
   2112       unsigned int h;
   2113       bfd_byte b;
   2114 
   2115       buf = (bfd_byte *) bfd_malloc (size);
   2116       if (buf == NULL)
   2117 	goto error_return;
   2118       p = buf;
   2119 
   2120       left = size;
   2121 
   2122       /* I don't know what the next eight bytes are for.  */
   2123       if (bfd_bread (ab, (bfd_size_type) 8, nbfd) != 8)
   2124 	goto error_return;
   2125 
   2126       /* This is the uncompression algorithm.  It's a simple
   2127 	 dictionary based scheme in which each character is predicted
   2128 	 by a hash of the previous three characters.  A control byte
   2129 	 indicates whether the character is predicted or whether it
   2130 	 appears in the input stream; each control byte manages the
   2131 	 next eight bytes in the output stream.  */
   2132       memset (dict, 0, sizeof dict);
   2133       h = 0;
   2134       while (bfd_bread (&b, (bfd_size_type) 1, nbfd) == 1)
   2135 	{
   2136 	  unsigned int i;
   2137 
   2138 	  for (i = 0; i < 8; i++, b >>= 1)
   2139 	    {
   2140 	      bfd_byte n;
   2141 
   2142 	      if ((b & 1) == 0)
   2143 		n = dict[h];
   2144 	      else
   2145 		{
   2146 		  if (bfd_bread (&n, 1, nbfd) != 1)
   2147 		    goto error_return;
   2148 		  dict[h] = n;
   2149 		}
   2150 
   2151 	      *p++ = n;
   2152 
   2153 	      --left;
   2154 	      if (left == 0)
   2155 		break;
   2156 
   2157 	      h <<= 4;
   2158 	      h ^= n;
   2159 	      h &= sizeof dict - 1;
   2160 	    }
   2161 
   2162 	  if (left == 0)
   2163 	    break;
   2164 	}
   2165     }
   2166 
   2167   /* Now the uncompressed file contents are in buf.  */
   2168   bim = ((struct bfd_in_memory *)
   2169 	 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
   2170   if (bim == NULL)
   2171     goto error_return;
   2172   bim->size = size;
   2173   bim->buffer = buf;
   2174 
   2175   nbfd->mtime_set = true;
   2176   nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
   2177 
   2178   nbfd->flags |= BFD_IN_MEMORY;
   2179   nbfd->iostream = bim;
   2180   nbfd->iovec = &_bfd_memory_iovec;
   2181   nbfd->origin = 0;
   2182   BFD_ASSERT (! nbfd->cacheable);
   2183 
   2184   return nbfd;
   2185 
   2186  error_return:
   2187   free (buf);
   2188   if (nbfd != NULL)
   2189     bfd_close (nbfd);
   2190   return NULL;
   2191 }
   2192 
   2193 /* Open the next archived file.  */
   2194 
   2195 static bfd *
   2196 alpha_ecoff_openr_next_archived_file (bfd *archive, bfd *last_file)
   2197 {
   2198   ufile_ptr filestart;
   2199 
   2200   if (last_file == NULL)
   2201     filestart = bfd_ardata (archive)->first_file_filepos;
   2202   else
   2203     {
   2204       struct areltdata *t;
   2205       struct ar_hdr *h;
   2206       bfd_size_type size;
   2207 
   2208       /* We can't use arelt_size here, because that uses parsed_size,
   2209 	 which is the uncompressed size.  We need the compressed size.  */
   2210       t = (struct areltdata *) last_file->arelt_data;
   2211       h = (struct ar_hdr *) t->arch_header;
   2212       size = strtol (h->ar_size, (char **) NULL, 10);
   2213 
   2214       /* Pad to an even boundary...
   2215 	 Note that last_file->origin can be odd in the case of
   2216 	 BSD-4.4-style element with a long odd size.  */
   2217       filestart = last_file->proxy_origin + size;
   2218       filestart += filestart % 2;
   2219       if (filestart < last_file->proxy_origin)
   2220 	{
   2221 	  /* Prevent looping.  See PR19256.  */
   2222 	  bfd_set_error (bfd_error_malformed_archive);
   2223 	  return NULL;
   2224 	}
   2225     }
   2226 
   2227   return alpha_ecoff_get_elt_at_filepos (archive, filestart, NULL);
   2228 }
   2229 
   2230 /* Open the archive file given an index into the armap.  */
   2231 
   2232 static bfd *
   2233 alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
   2234 {
   2235   carsym *entry;
   2236 
   2237   entry = bfd_ardata (abfd)->symdefs + sym_index;
   2238   return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset,
   2239 					 NULL);
   2240 }
   2241 
   2242 static void
   2243 alpha_ecoff_swap_coff_aux_in (bfd *abfd ATTRIBUTE_UNUSED,
   2244 			      void *ext1 ATTRIBUTE_UNUSED,
   2245 			      int type ATTRIBUTE_UNUSED,
   2246 			      int in_class ATTRIBUTE_UNUSED,
   2247 			      int indx ATTRIBUTE_UNUSED,
   2248 			      int numaux ATTRIBUTE_UNUSED,
   2249 			      void *in1 ATTRIBUTE_UNUSED)
   2250 {
   2251 }
   2252 
   2253 static void
   2254 alpha_ecoff_swap_coff_sym_in (bfd *abfd ATTRIBUTE_UNUSED,
   2255 			      void *ext1 ATTRIBUTE_UNUSED,
   2256 			      void *in1 ATTRIBUTE_UNUSED)
   2257 {
   2258 }
   2259 
   2260 static void
   2261 alpha_ecoff_swap_coff_lineno_in (bfd *abfd ATTRIBUTE_UNUSED,
   2262 				 void *ext1 ATTRIBUTE_UNUSED,
   2263 				 void *in1 ATTRIBUTE_UNUSED)
   2264 {
   2265 }
   2266 
   2267 static unsigned int
   2268 alpha_ecoff_swap_coff_aux_out (bfd *abfd ATTRIBUTE_UNUSED,
   2269 			       void *inp ATTRIBUTE_UNUSED,
   2270 			       int type ATTRIBUTE_UNUSED,
   2271 			       int in_class ATTRIBUTE_UNUSED,
   2272 			       int indx ATTRIBUTE_UNUSED,
   2273 			       int numaux ATTRIBUTE_UNUSED,
   2274 			       void *extp ATTRIBUTE_UNUSED)
   2275 {
   2276   return 0;
   2277 }
   2278 
   2279 static unsigned int
   2280 alpha_ecoff_swap_coff_sym_out (bfd *abfd ATTRIBUTE_UNUSED,
   2281 			       void *inp ATTRIBUTE_UNUSED,
   2282 			       void *extp ATTRIBUTE_UNUSED)
   2283 {
   2284   return 0;
   2285 }
   2286 
   2287 static unsigned int
   2288 alpha_ecoff_swap_coff_lineno_out (bfd *abfd ATTRIBUTE_UNUSED,
   2289 				  void *inp ATTRIBUTE_UNUSED,
   2290 				  void *extp ATTRIBUTE_UNUSED)
   2291 {
   2292   return 0;
   2293 }
   2294 
   2295 static unsigned int
   2296 alpha_ecoff_swap_coff_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
   2297 				 void *inp ATTRIBUTE_UNUSED,
   2298 				 void *extp ATTRIBUTE_UNUSED)
   2299 {
   2300   return 0;
   2301 }
   2302 
   2303 /* This is the ECOFF backend structure.  The backend field of the
   2305    target vector points to this.  */
   2306 
   2307 static const struct ecoff_backend_data alpha_ecoff_backend_data =
   2308 {
   2309   /* COFF backend structure.  */
   2310   {
   2311     alpha_ecoff_swap_coff_aux_in, alpha_ecoff_swap_coff_sym_in,
   2312     alpha_ecoff_swap_coff_lineno_in, alpha_ecoff_swap_coff_aux_out,
   2313     alpha_ecoff_swap_coff_sym_out, alpha_ecoff_swap_coff_lineno_out,
   2314     alpha_ecoff_swap_coff_reloc_out,
   2315     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
   2316     alpha_ecoff_swap_scnhdr_out,
   2317     FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, true,
   2318     ECOFF_NO_LONG_SECTION_NAMES, 4, false, 2, 32768,
   2319     alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
   2320     alpha_ecoff_swap_scnhdr_in, NULL,
   2321     alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
   2322     alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
   2323     _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
   2324     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
   2325     NULL, NULL, NULL, NULL
   2326   },
   2327   /* Supported architecture.  */
   2328   bfd_arch_alpha,
   2329   /* Initial portion of armap string.  */
   2330   "________64",
   2331   /* The page boundary used to align sections in a demand-paged
   2332      executable file.  E.g., 0x1000.  */
   2333   0x2000,
   2334   /* TRUE if the .rdata section is part of the text segment, as on the
   2335      Alpha.  FALSE if .rdata is part of the data segment, as on the
   2336      MIPS.  */
   2337   true,
   2338   /* Bitsize of constructor entries.  */
   2339   64,
   2340   /* Reloc to use for constructor entries.  */
   2341   &alpha_howto_table[ALPHA_R_REFQUAD],
   2342   {
   2343     /* Symbol table magic number.  */
   2344     magicSym2,
   2345     /* Alignment of debugging information.  E.g., 4.  */
   2346     8,
   2347     /* Sizes of external symbolic information.  */
   2348     sizeof (struct hdr_ext),
   2349     sizeof (struct dnr_ext),
   2350     sizeof (struct pdr_ext),
   2351     sizeof (struct sym_ext),
   2352     sizeof (struct opt_ext),
   2353     sizeof (struct fdr_ext),
   2354     sizeof (struct rfd_ext),
   2355     sizeof (struct ext_ext),
   2356     /* Functions to swap in external symbolic data.  */
   2357     ecoff_swap_hdr_in,
   2358     ecoff_swap_dnr_in,
   2359     ecoff_swap_pdr_in,
   2360     ecoff_swap_sym_in,
   2361     ecoff_swap_opt_in,
   2362     ecoff_swap_fdr_in,
   2363     ecoff_swap_rfd_in,
   2364     ecoff_swap_ext_in,
   2365     _bfd_ecoff_swap_tir_in,
   2366     _bfd_ecoff_swap_rndx_in,
   2367     /* Functions to swap out external symbolic data.  */
   2368     ecoff_swap_hdr_out,
   2369     ecoff_swap_dnr_out,
   2370     ecoff_swap_pdr_out,
   2371     ecoff_swap_sym_out,
   2372     ecoff_swap_opt_out,
   2373     ecoff_swap_fdr_out,
   2374     ecoff_swap_rfd_out,
   2375     ecoff_swap_ext_out,
   2376     _bfd_ecoff_swap_tir_out,
   2377     _bfd_ecoff_swap_rndx_out,
   2378     /* Function to read in symbolic data.  */
   2379     _bfd_ecoff_slurp_symbolic_info
   2380   },
   2381   /* External reloc size.  */
   2382   RELSZ,
   2383   /* Reloc swapping functions.  */
   2384   alpha_ecoff_swap_reloc_in,
   2385   alpha_ecoff_swap_reloc_out,
   2386   /* Backend reloc tweaking.  */
   2387   alpha_adjust_reloc_in,
   2388   alpha_adjust_reloc_out,
   2389   /* Relocate section contents while linking.  */
   2390   alpha_relocate_section,
   2391   /* Do final adjustments to filehdr and aouthdr.  */
   2392   alpha_adjust_headers,
   2393   /* Read an element from an archive at a given file position.  */
   2394   alpha_ecoff_get_elt_at_filepos
   2395 };
   2396 
   2397 /* Looking up a reloc type is Alpha specific.  */
   2398 #define _bfd_ecoff_bfd_reloc_type_lookup alpha_bfd_reloc_type_lookup
   2399 #define _bfd_ecoff_bfd_reloc_name_lookup \
   2400   alpha_bfd_reloc_name_lookup
   2401 
   2402 /* So is getting relocated section contents.  */
   2403 #define _bfd_ecoff_bfd_get_relocated_section_contents \
   2404   alpha_ecoff_get_relocated_section_contents
   2405 
   2406 /* Handling file windows is generic.  */
   2407 #define _bfd_ecoff_get_section_contents_in_window \
   2408   _bfd_generic_get_section_contents_in_window
   2409 
   2410 /* Input section flag lookup is generic.  */
   2411 #define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
   2412 
   2413 /* Relaxing sections is generic.  */
   2414 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
   2415 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
   2416 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
   2417 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
   2418 #define _bfd_ecoff_bfd_group_name bfd_generic_group_name
   2419 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
   2420 #define _bfd_ecoff_section_already_linked \
   2421   _bfd_coff_section_already_linked
   2422 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
   2423 #define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
   2424 #define _bfd_ecoff_bfd_define_start_stop    bfd_generic_define_start_stop
   2425 #define _bfd_ecoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
   2426 
   2427 /* Installing internal relocations in a section is also generic.  */
   2428 #define _bfd_ecoff_set_reloc _bfd_generic_set_reloc
   2429 
   2430 const bfd_target alpha_ecoff_le_vec =
   2431 {
   2432   "ecoff-littlealpha",		/* name */
   2433   bfd_target_ecoff_flavour,
   2434   BFD_ENDIAN_LITTLE,		/* data byte order is little */
   2435   BFD_ENDIAN_LITTLE,		/* header byte order is little */
   2436 
   2437   (HAS_RELOC | EXEC_P		/* object flags */
   2438    | HAS_LINENO | HAS_DEBUG
   2439    | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
   2440 
   2441   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE
   2442    | SEC_DATA | SEC_SMALL_DATA),
   2443   0,				/* leading underscore */
   2444   ' ',				/* ar_pad_char */
   2445   15,				/* ar_max_namelen */
   2446   0,				/* match priority.  */
   2447   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
   2448   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   2449      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   2450      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
   2451   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   2452      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   2453      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
   2454 
   2455   {				/* bfd_check_format */
   2456     _bfd_dummy_target,
   2457     alpha_ecoff_object_p,
   2458     bfd_generic_archive_p,
   2459     _bfd_dummy_target
   2460   },
   2461   {				/* bfd_set_format */
   2462     _bfd_bool_bfd_false_error,
   2463     _bfd_ecoff_mkobject,
   2464     _bfd_generic_mkarchive,
   2465     _bfd_bool_bfd_false_error
   2466   },
   2467   {				/* bfd_write_contents */
   2468     _bfd_bool_bfd_false_error,
   2469     _bfd_ecoff_write_object_contents,
   2470     _bfd_write_archive_contents,
   2471     _bfd_bool_bfd_false_error
   2472   },
   2473 
   2474   BFD_JUMP_TABLE_GENERIC (_bfd_ecoff),
   2475   BFD_JUMP_TABLE_COPY (_bfd_ecoff),
   2476   BFD_JUMP_TABLE_CORE (_bfd_nocore),
   2477   BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff),
   2478   BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff),
   2479   BFD_JUMP_TABLE_RELOCS (_bfd_ecoff),
   2480   BFD_JUMP_TABLE_WRITE (_bfd_ecoff),
   2481   BFD_JUMP_TABLE_LINK (_bfd_ecoff),
   2482   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
   2483 
   2484   NULL,
   2485 
   2486   &alpha_ecoff_backend_data
   2487 };
   2488