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