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