xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/elf64-alpha.c (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
1 /* Alpha specific support for 64-bit ELF
2    Copyright (C) 1996-2022 Free Software Foundation, Inc.
3    Contributed by Richard Henderson <rth@tamu.edu>.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 
23 /* We need a published ABI spec for this.  Until one comes out, don't
24    assume this'll remain unchanged forever.  */
25 
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "libbfd.h"
29 #include "elf-bfd.h"
30 #include "ecoff-bfd.h"
31 
32 #include "elf/alpha.h"
33 
34 #define ALPHAECOFF
35 
36 #define NO_COFF_RELOCS
37 #define NO_COFF_SYMBOLS
38 #define NO_COFF_LINENOS
39 
40 /* Get the ECOFF swapping routines.  Needed for the debug information.  */
41 #include "coff/internal.h"
42 #include "coff/sym.h"
43 #include "coff/symconst.h"
44 #include "coff/ecoff.h"
45 #include "coff/alpha.h"
46 #include "aout/ar.h"
47 #include "libcoff.h"
48 #include "libecoff.h"
49 #define ECOFF_64
50 #include "ecoffswap.h"
51 
52 
53 /* Instruction data for plt generation and relaxation.  */
54 
55 #define OP_LDA		0x08U
56 #define OP_LDAH		0x09U
57 #define OP_LDQ		0x29U
58 #define OP_BR		0x30U
59 #define OP_BSR		0x34U
60 
61 #define INSN_LDA	(OP_LDA << 26)
62 #define INSN_LDAH	(OP_LDAH << 26)
63 #define INSN_LDQ	(OP_LDQ << 26)
64 #define INSN_BR		(OP_BR << 26)
65 
66 #define INSN_ADDQ	0x40000400
67 #define INSN_RDUNIQ	0x0000009e
68 #define INSN_SUBQ	0x40000520
69 #define INSN_S4SUBQ	0x40000560
70 #define INSN_UNOP	0x2ffe0000
71 
72 #define INSN_JSR	0x68004000
73 #define INSN_JMP	0x68000000
74 #define INSN_JSR_MASK	0xfc00c000
75 
76 #define INSN_A(I,A)		(I | ((unsigned) A << 21))
77 #define INSN_AB(I,A,B)		(INSN_A (I, A) | (B << 16))
78 #define INSN_ABC(I,A,B,C)	(INSN_A (I, A) | (B << 16) | C)
79 #define INSN_ABO(I,A,B,O)	(INSN_A (I, A) | (B << 16) | ((O) & 0xffff))
80 #define INSN_AD(I,A,D)		(INSN_A (I, A) | (((D) >> 2) & 0x1fffff))
81 
82 /* PLT/GOT Stuff */
83 
84 /* Set by ld emulation.  Putting this into the link_info or hash structure
85    is simply working too hard.  */
86 #if defined(USE_SECUREPLT) && 0 /* XXX port-alpha/57511 */
87 bool elf64_alpha_use_secureplt = true;
88 #else
89 bool elf64_alpha_use_secureplt = false;
90 #endif
91 
92 #define OLD_PLT_HEADER_SIZE	32
93 #define OLD_PLT_ENTRY_SIZE	12
94 #define NEW_PLT_HEADER_SIZE	36
95 #define NEW_PLT_ENTRY_SIZE	4
96 
97 #define PLT_HEADER_SIZE \
98   (elf64_alpha_use_secureplt ? NEW_PLT_HEADER_SIZE : OLD_PLT_HEADER_SIZE)
99 #define PLT_ENTRY_SIZE \
100   (elf64_alpha_use_secureplt ? NEW_PLT_ENTRY_SIZE : OLD_PLT_ENTRY_SIZE)
101 
102 /* ld --traditional-format uses this older format instead. */
103 #define OLD_PLT_ENTRY_WORD1	0x279f0000	/* ldah $28, 0($31) */
104 #define OLD_PLT_ENTRY_WORD2	0x239c0000	/* lda  $28, 0($28) */
105 #define OLD_PLT_ENTRY_WORD3	0xc3e00000	/* br   $31, plt0   */
106 
107 #define MAX_GOT_SIZE		(64*1024)
108 
109 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
110 
111 
112 /* Used to implement multiple .got subsections.  */
113 struct alpha_elf_got_entry
114 {
115   struct alpha_elf_got_entry *next;
116 
117   /* Which .got subsection?  */
118   bfd *gotobj;
119 
120   /* The addend in effect for this entry.  */
121   bfd_vma addend;
122 
123   /* The .got offset for this entry.  */
124   int got_offset;
125 
126   /* The .plt offset for this entry.  */
127   int plt_offset;
128 
129   /* How many references to this entry?  */
130   int use_count;
131 
132   /* The relocation type of this entry.  */
133   unsigned char reloc_type;
134 
135   /* How a LITERAL is used.  */
136   unsigned char flags;
137 
138   /* Have we initialized the dynamic relocation for this entry?  */
139   unsigned char reloc_done;
140 
141   /* Have we adjusted this entry for SEC_MERGE?  */
142   unsigned char reloc_xlated;
143 };
144 
145 struct alpha_elf_reloc_entry
146 {
147   struct alpha_elf_reloc_entry *next;
148 
149   /* Which .reloc section? */
150   asection *srel;
151 
152   /* Which section this relocation is against? */
153   asection *sec;
154 
155   /* How many did we find?  */
156   unsigned long count;
157 
158   /* What kind of relocation? */
159   unsigned int rtype;
160 };
161 
162 struct alpha_elf_link_hash_entry
163 {
164   struct elf_link_hash_entry root;
165 
166   /* External symbol information.  */
167   EXTR esym;
168 
169   /* Cumulative flags for all the .got entries.  */
170   int flags;
171 
172   /* Contexts in which a literal was referenced.  */
173 #define ALPHA_ELF_LINK_HASH_LU_ADDR	 0x01
174 #define ALPHA_ELF_LINK_HASH_LU_MEM	 0x02
175 #define ALPHA_ELF_LINK_HASH_LU_BYTE	 0x04
176 #define ALPHA_ELF_LINK_HASH_LU_JSR	 0x08
177 #define ALPHA_ELF_LINK_HASH_LU_TLSGD	 0x10
178 #define ALPHA_ELF_LINK_HASH_LU_TLSLDM	 0x20
179 #define ALPHA_ELF_LINK_HASH_LU_JSRDIRECT 0x40
180 #define ALPHA_ELF_LINK_HASH_LU_PLT	 0x38
181 #define ALPHA_ELF_LINK_HASH_TLS_IE	 0x80
182 
183   /* Used to implement multiple .got subsections.  */
184   struct alpha_elf_got_entry *got_entries;
185 
186   /* Used to count non-got, non-plt relocations for delayed sizing
187      of relocation sections.  */
188   struct alpha_elf_reloc_entry *reloc_entries;
189 };
190 
191 /* Alpha ELF linker hash table.  */
192 
193 struct alpha_elf_link_hash_table
194 {
195   struct elf_link_hash_table root;
196 
197   /* The head of a list of .got subsections linked through
198      alpha_elf_tdata(abfd)->got_link_next.  */
199   bfd *got_list;
200 
201   /* The most recent relax pass that we've seen.  The GOTs
202      should be regenerated if this doesn't match.  */
203   int relax_trip;
204 };
205 
206 /* Look up an entry in a Alpha ELF linker hash table.  */
207 
208 #define alpha_elf_link_hash_lookup(table, string, create, copy, follow)	\
209   ((struct alpha_elf_link_hash_entry *)					\
210    elf_link_hash_lookup (&(table)->root, (string), (create),		\
211 			 (copy), (follow)))
212 
213 /* Traverse a Alpha ELF linker hash table.  */
214 
215 #define alpha_elf_link_hash_traverse(table, func, info)			\
216   (elf_link_hash_traverse						\
217    (&(table)->root,							\
218     (bool (*) (struct elf_link_hash_entry *, void *)) (func),		\
219     (info)))
220 
221 /* Get the Alpha ELF linker hash table from a link_info structure.  */
222 
223 #define alpha_elf_hash_table(p) \
224   ((is_elf_hash_table ((p)->hash)					\
225     && elf_hash_table_id (elf_hash_table (p)) == ALPHA_ELF_DATA)	\
226    ? (struct alpha_elf_link_hash_table *) (p)->hash : NULL)
227 
228 /* Get the object's symbols as our own entry type.  */
229 
230 #define alpha_elf_sym_hashes(abfd) \
231   ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
232 
233 /* Should we do dynamic things to this symbol?  This differs from the
234    generic version in that we never need to consider function pointer
235    equality wrt PLT entries -- we don't create a PLT entry if a symbol's
236    address is ever taken.  */
237 
238 static inline bool
239 alpha_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
240 			    struct bfd_link_info *info)
241 {
242   return _bfd_elf_dynamic_symbol_p (h, info, 0);
243 }
244 
245 /* Create an entry in a Alpha ELF linker hash table.  */
246 
247 static struct bfd_hash_entry *
248 elf64_alpha_link_hash_newfunc (struct bfd_hash_entry *entry,
249 			       struct bfd_hash_table *table,
250 			       const char *string)
251 {
252   struct alpha_elf_link_hash_entry *ret =
253     (struct alpha_elf_link_hash_entry *) entry;
254 
255   /* Allocate the structure if it has not already been allocated by a
256      subclass.  */
257   if (ret == (struct alpha_elf_link_hash_entry *) NULL)
258     ret = ((struct alpha_elf_link_hash_entry *)
259 	   bfd_hash_allocate (table,
260 			      sizeof (struct alpha_elf_link_hash_entry)));
261   if (ret == (struct alpha_elf_link_hash_entry *) NULL)
262     return (struct bfd_hash_entry *) ret;
263 
264   /* Call the allocation method of the superclass.  */
265   ret = ((struct alpha_elf_link_hash_entry *)
266 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
267 				     table, string));
268   if (ret != (struct alpha_elf_link_hash_entry *) NULL)
269     {
270       /* Set local fields.  */
271       memset (&ret->esym, 0, sizeof (EXTR));
272       /* We use -2 as a marker to indicate that the information has
273 	 not been set.  -1 means there is no associated ifd.  */
274       ret->esym.ifd = -2;
275       ret->flags = 0;
276       ret->got_entries = NULL;
277       ret->reloc_entries = NULL;
278     }
279 
280   return (struct bfd_hash_entry *) ret;
281 }
282 
283 /* Create a Alpha ELF linker hash table.  */
284 
285 static struct bfd_link_hash_table *
286 elf64_alpha_bfd_link_hash_table_create (bfd *abfd)
287 {
288   struct alpha_elf_link_hash_table *ret;
289   size_t amt = sizeof (struct alpha_elf_link_hash_table);
290 
291   ret = (struct alpha_elf_link_hash_table *) bfd_zmalloc (amt);
292   if (ret == (struct alpha_elf_link_hash_table *) NULL)
293     return NULL;
294 
295   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
296 				      elf64_alpha_link_hash_newfunc,
297 				      sizeof (struct alpha_elf_link_hash_entry),
298 				      ALPHA_ELF_DATA))
299     {
300       free (ret);
301       return NULL;
302     }
303 
304   return &ret->root.root;
305 }
306 
307 /* Alpha ELF follows MIPS ELF in using a special find_nearest_line
308    routine in order to handle the ECOFF debugging information.  */
309 
310 struct alpha_elf_find_line
311 {
312   struct ecoff_debug_info d;
313   struct ecoff_find_line i;
314 };
315 
316 /* We have some private fields hanging off of the elf_tdata structure.  */
317 
318 struct alpha_elf_obj_tdata
319 {
320   struct elf_obj_tdata root;
321 
322   /* For every input file, these are the got entries for that object's
323      local symbols.  */
324   struct alpha_elf_got_entry ** local_got_entries;
325 
326   /* For every input file, this is the object that owns the got that
327      this input file uses.  */
328   bfd *gotobj;
329 
330   /* For every got, this is a linked list through the objects using this got */
331   bfd *in_got_link_next;
332 
333   /* For every got, this is a link to the next got subsegment.  */
334   bfd *got_link_next;
335 
336   /* For every got, this is the section.  */
337   asection *got;
338 
339   /* For every got, this is it's total number of words.  */
340   int total_got_size;
341 
342   /* For every got, this is the sum of the number of words required
343      to hold all of the member object's local got.  */
344   int local_got_size;
345 
346   /* Used by elf64_alpha_find_nearest_line entry point.  */
347   struct alpha_elf_find_line *find_line_info;
348 
349 };
350 
351 #define alpha_elf_tdata(abfd) \
352   ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
353 
354 #define is_alpha_elf(bfd) \
355   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
356    && elf_tdata (bfd) != NULL \
357    && elf_object_id (bfd) == ALPHA_ELF_DATA)
358 
359 static bool
360 elf64_alpha_mkobject (bfd *abfd)
361 {
362   return bfd_elf_allocate_object (abfd, sizeof (struct alpha_elf_obj_tdata),
363 				  ALPHA_ELF_DATA);
364 }
365 
366 static bool
367 elf64_alpha_object_p (bfd *abfd)
368 {
369   /* Set the right machine number for an Alpha ELF file.  */
370   return bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
371 }
372 
373 /* A relocation function which doesn't do anything.  */
374 
375 static bfd_reloc_status_type
376 elf64_alpha_reloc_nil (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
377 		       asymbol *sym ATTRIBUTE_UNUSED,
378 		       void * data ATTRIBUTE_UNUSED, asection *sec,
379 		       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
380 {
381   if (output_bfd)
382     reloc->address += sec->output_offset;
383   return bfd_reloc_ok;
384 }
385 
386 /* A relocation function used for an unsupported reloc.  */
387 
388 static bfd_reloc_status_type
389 elf64_alpha_reloc_bad (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
390 		       asymbol *sym ATTRIBUTE_UNUSED,
391 		       void * data ATTRIBUTE_UNUSED, asection *sec,
392 		       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
393 {
394   if (output_bfd)
395     reloc->address += sec->output_offset;
396   return bfd_reloc_notsupported;
397 }
398 
399 /* Do the work of the GPDISP relocation.  */
400 
401 static bfd_reloc_status_type
402 elf64_alpha_do_reloc_gpdisp (bfd *abfd, bfd_vma gpdisp, bfd_byte *p_ldah,
403 			     bfd_byte *p_lda)
404 {
405   bfd_reloc_status_type ret = bfd_reloc_ok;
406   bfd_vma addend;
407   unsigned long i_ldah, i_lda;
408 
409   i_ldah = bfd_get_32 (abfd, p_ldah);
410   i_lda = bfd_get_32 (abfd, p_lda);
411 
412   /* Complain if the instructions are not correct.  */
413   if (((i_ldah >> 26) & 0x3f) != 0x09
414       || ((i_lda >> 26) & 0x3f) != 0x08)
415     ret = bfd_reloc_dangerous;
416 
417   /* Extract the user-supplied offset, mirroring the sign extensions
418      that the instructions perform.  */
419   addend = ((i_ldah & 0xffff) << 16) | (i_lda & 0xffff);
420   addend = (addend ^ 0x80008000) - 0x80008000;
421 
422   gpdisp += addend;
423 
424   if ((bfd_signed_vma) gpdisp < -(bfd_signed_vma) 0x80000000
425       || (bfd_signed_vma) gpdisp >= (bfd_signed_vma) 0x7fff8000)
426     ret = bfd_reloc_overflow;
427 
428   /* compensate for the sign extension again.  */
429   i_ldah = ((i_ldah & 0xffff0000)
430 	    | (((gpdisp >> 16) + ((gpdisp >> 15) & 1)) & 0xffff));
431   i_lda = (i_lda & 0xffff0000) | (gpdisp & 0xffff);
432 
433   bfd_put_32 (abfd, (bfd_vma) i_ldah, p_ldah);
434   bfd_put_32 (abfd, (bfd_vma) i_lda, p_lda);
435 
436   return ret;
437 }
438 
439 /* The special function for the GPDISP reloc.  */
440 
441 static bfd_reloc_status_type
442 elf64_alpha_reloc_gpdisp (bfd *abfd, arelent *reloc_entry,
443 			  asymbol *sym ATTRIBUTE_UNUSED, void * data,
444 			  asection *input_section, bfd *output_bfd,
445 			  char **err_msg)
446 {
447   bfd_reloc_status_type ret;
448   bfd_vma gp, relocation;
449   bfd_vma high_address;
450   bfd_byte *p_ldah, *p_lda;
451 
452   /* Don't do anything if we're not doing a final link.  */
453   if (output_bfd)
454     {
455       reloc_entry->address += input_section->output_offset;
456       return bfd_reloc_ok;
457     }
458 
459   high_address = bfd_get_section_limit (abfd, input_section);
460   if (reloc_entry->address > high_address
461       || reloc_entry->address + reloc_entry->addend > high_address)
462     return bfd_reloc_outofrange;
463 
464   /* The gp used in the portion of the output object to which this
465      input object belongs is cached on the input bfd.  */
466   gp = _bfd_get_gp_value (abfd);
467 
468   relocation = (input_section->output_section->vma
469 		+ input_section->output_offset
470 		+ reloc_entry->address);
471 
472   p_ldah = (bfd_byte *) data + reloc_entry->address;
473   p_lda = p_ldah + reloc_entry->addend;
474 
475   ret = elf64_alpha_do_reloc_gpdisp (abfd, gp - relocation, p_ldah, p_lda);
476 
477   /* Complain if the instructions are not correct.  */
478   if (ret == bfd_reloc_dangerous)
479     *err_msg = _("GPDISP relocation did not find ldah and lda instructions");
480 
481   return ret;
482 }
483 
484 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
485    from smaller values.  Start with zero, widen, *then* decrement.  */
486 #define MINUS_ONE	(((bfd_vma)0) - 1)
487 
488 
489 #define SKIP_HOWTO(N) \
490   HOWTO(N, 0, 0, 0, 0, 0, complain_overflow_dont, elf64_alpha_reloc_bad, 0, 0, 0, 0, 0)
491 
492 static reloc_howto_type elf64_alpha_howto_table[] =
493 {
494   HOWTO (R_ALPHA_NONE,		/* type */
495 	 0,			/* rightshift */
496 	 0,			/* size */
497 	 0,			/* bitsize */
498 	 true,			/* pc_relative */
499 	 0,			/* bitpos */
500 	 complain_overflow_dont, /* complain_on_overflow */
501 	 elf64_alpha_reloc_nil,	/* special_function */
502 	 "NONE",		/* name */
503 	 false,			/* partial_inplace */
504 	 0,			/* src_mask */
505 	 0,			/* dst_mask */
506 	 true),			/* pcrel_offset */
507 
508   /* A 32 bit reference to a symbol.  */
509   HOWTO (R_ALPHA_REFLONG,	/* type */
510 	 0,			/* rightshift */
511 	 4,			/* size */
512 	 32,			/* bitsize */
513 	 false,			/* pc_relative */
514 	 0,			/* bitpos */
515 	 complain_overflow_bitfield, /* complain_on_overflow */
516 	 bfd_elf_generic_reloc,	/* special_function */
517 	 "REFLONG",		/* name */
518 	 false,			/* partial_inplace */
519 	 0xffffffff,		/* src_mask */
520 	 0xffffffff,		/* dst_mask */
521 	 false),		/* pcrel_offset */
522 
523   /* A 64 bit reference to a symbol.  */
524   HOWTO (R_ALPHA_REFQUAD,	/* type */
525 	 0,			/* rightshift */
526 	 8,			/* size */
527 	 64,			/* bitsize */
528 	 false,			/* pc_relative */
529 	 0,			/* bitpos */
530 	 complain_overflow_bitfield, /* complain_on_overflow */
531 	 bfd_elf_generic_reloc,	/* special_function */
532 	 "REFQUAD",		/* name */
533 	 false,			/* partial_inplace */
534 	 MINUS_ONE,		/* src_mask */
535 	 MINUS_ONE,		/* dst_mask */
536 	 false),		/* pcrel_offset */
537 
538   /* A 32 bit GP relative offset.  This is just like REFLONG except
539      that when the value is used the value of the gp register will be
540      added in.  */
541   HOWTO (R_ALPHA_GPREL32,	/* type */
542 	 0,			/* rightshift */
543 	 4,			/* size */
544 	 32,			/* bitsize */
545 	 false,			/* pc_relative */
546 	 0,			/* bitpos */
547 	 complain_overflow_bitfield, /* complain_on_overflow */
548 	 bfd_elf_generic_reloc,	/* special_function */
549 	 "GPREL32",		/* name */
550 	 false,			/* partial_inplace */
551 	 0xffffffff,		/* src_mask */
552 	 0xffffffff,		/* dst_mask */
553 	 false),		/* pcrel_offset */
554 
555   /* Used for an instruction that refers to memory off the GP register.  */
556   HOWTO (R_ALPHA_LITERAL,	/* type */
557 	 0,			/* rightshift */
558 	 2,			/* size */
559 	 16,			/* bitsize */
560 	 false,			/* pc_relative */
561 	 0,			/* bitpos */
562 	 complain_overflow_signed, /* complain_on_overflow */
563 	 bfd_elf_generic_reloc,	/* special_function */
564 	 "ELF_LITERAL",		/* name */
565 	 false,			/* partial_inplace */
566 	 0xffff,		/* src_mask */
567 	 0xffff,		/* dst_mask */
568 	 false),		/* pcrel_offset */
569 
570   /* This reloc only appears immediately following an ELF_LITERAL reloc.
571      It identifies a use of the literal.  The symbol index is special:
572      1 means the literal address is in the base register of a memory
573      format instruction; 2 means the literal address is in the byte
574      offset register of a byte-manipulation instruction; 3 means the
575      literal address is in the target register of a jsr instruction.
576      This does not actually do any relocation.  */
577   HOWTO (R_ALPHA_LITUSE,	/* type */
578 	 0,			/* rightshift */
579 	 2,			/* size */
580 	 32,			/* bitsize */
581 	 false,			/* pc_relative */
582 	 0,			/* bitpos */
583 	 complain_overflow_dont, /* complain_on_overflow */
584 	 elf64_alpha_reloc_nil,	/* special_function */
585 	 "LITUSE",		/* name */
586 	 false,			/* partial_inplace */
587 	 0,			/* src_mask */
588 	 0,			/* dst_mask */
589 	 false),		/* pcrel_offset */
590 
591   /* Load the gp register.  This is always used for a ldah instruction
592      which loads the upper 16 bits of the gp register.  The symbol
593      index of the GPDISP instruction is an offset in bytes to the lda
594      instruction that loads the lower 16 bits.  The value to use for
595      the relocation is the difference between the GP value and the
596      current location; the load will always be done against a register
597      holding the current address.
598 
599      NOTE: Unlike ECOFF, partial in-place relocation is not done.  If
600      any offset is present in the instructions, it is an offset from
601      the register to the ldah instruction.  This lets us avoid any
602      stupid hackery like inventing a gp value to do partial relocation
603      against.  Also unlike ECOFF, we do the whole relocation off of
604      the GPDISP rather than a GPDISP_HI16/GPDISP_LO16 pair.  An odd,
605      space consuming bit, that, since all the information was present
606      in the GPDISP_HI16 reloc.  */
607   HOWTO (R_ALPHA_GPDISP,	/* type */
608 	 16,			/* rightshift */
609 	 4,			/* size */
610 	 16,			/* bitsize */
611 	 false,			/* pc_relative */
612 	 0,			/* bitpos */
613 	 complain_overflow_dont, /* complain_on_overflow */
614 	 elf64_alpha_reloc_gpdisp, /* special_function */
615 	 "GPDISP",		/* name */
616 	 false,			/* partial_inplace */
617 	 0xffff,		/* src_mask */
618 	 0xffff,		/* dst_mask */
619 	 true),			/* pcrel_offset */
620 
621   /* A 21 bit branch.  */
622   HOWTO (R_ALPHA_BRADDR,	/* type */
623 	 2,			/* rightshift */
624 	 4,			/* size */
625 	 21,			/* bitsize */
626 	 true,			/* pc_relative */
627 	 0,			/* bitpos */
628 	 complain_overflow_signed, /* complain_on_overflow */
629 	 bfd_elf_generic_reloc,	/* special_function */
630 	 "BRADDR",		/* name */
631 	 false,			/* partial_inplace */
632 	 0x1fffff,		/* src_mask */
633 	 0x1fffff,		/* dst_mask */
634 	 true),			/* pcrel_offset */
635 
636   /* A hint for a jump to a register.  */
637   HOWTO (R_ALPHA_HINT,		/* type */
638 	 2,			/* rightshift */
639 	 2,			/* size */
640 	 14,			/* bitsize */
641 	 true,			/* pc_relative */
642 	 0,			/* bitpos */
643 	 complain_overflow_dont, /* complain_on_overflow */
644 	 bfd_elf_generic_reloc,	/* special_function */
645 	 "HINT",		/* name */
646 	 false,			/* partial_inplace */
647 	 0x3fff,		/* src_mask */
648 	 0x3fff,		/* dst_mask */
649 	 true),			/* pcrel_offset */
650 
651   /* 16 bit PC relative offset.  */
652   HOWTO (R_ALPHA_SREL16,	/* type */
653 	 0,			/* rightshift */
654 	 2,			/* size */
655 	 16,			/* bitsize */
656 	 true,			/* pc_relative */
657 	 0,			/* bitpos */
658 	 complain_overflow_signed, /* complain_on_overflow */
659 	 bfd_elf_generic_reloc,	/* special_function */
660 	 "SREL16",		/* name */
661 	 false,			/* partial_inplace */
662 	 0xffff,		/* src_mask */
663 	 0xffff,		/* dst_mask */
664 	 true),			/* pcrel_offset */
665 
666   /* 32 bit PC relative offset.  */
667   HOWTO (R_ALPHA_SREL32,	/* type */
668 	 0,			/* rightshift */
669 	 4,			/* size */
670 	 32,			/* bitsize */
671 	 true,			/* pc_relative */
672 	 0,			/* bitpos */
673 	 complain_overflow_signed, /* complain_on_overflow */
674 	 bfd_elf_generic_reloc,	/* special_function */
675 	 "SREL32",		/* name */
676 	 false,			/* partial_inplace */
677 	 0xffffffff,		/* src_mask */
678 	 0xffffffff,		/* dst_mask */
679 	 true),			/* pcrel_offset */
680 
681   /* A 64 bit PC relative offset.  */
682   HOWTO (R_ALPHA_SREL64,	/* type */
683 	 0,			/* rightshift */
684 	 8,			/* size */
685 	 64,			/* bitsize */
686 	 true,			/* pc_relative */
687 	 0,			/* bitpos */
688 	 complain_overflow_signed, /* complain_on_overflow */
689 	 bfd_elf_generic_reloc,	/* special_function */
690 	 "SREL64",		/* name */
691 	 false,			/* partial_inplace */
692 	 MINUS_ONE,		/* src_mask */
693 	 MINUS_ONE,		/* dst_mask */
694 	 true),			/* pcrel_offset */
695 
696   /* Skip 12 - 16; deprecated ECOFF relocs.  */
697   SKIP_HOWTO (12),
698   SKIP_HOWTO (13),
699   SKIP_HOWTO (14),
700   SKIP_HOWTO (15),
701   SKIP_HOWTO (16),
702 
703   /* The high 16 bits of the displacement from GP to the target.  */
704   HOWTO (R_ALPHA_GPRELHIGH,
705 	 0,			/* rightshift */
706 	 2,			/* size */
707 	 16,			/* bitsize */
708 	 false,			/* pc_relative */
709 	 0,			/* bitpos */
710 	 complain_overflow_signed, /* complain_on_overflow */
711 	 bfd_elf_generic_reloc,	/* special_function */
712 	 "GPRELHIGH",		/* name */
713 	 false,			/* partial_inplace */
714 	 0xffff,		/* src_mask */
715 	 0xffff,		/* dst_mask */
716 	 false),		/* pcrel_offset */
717 
718   /* The low 16 bits of the displacement from GP to the target.  */
719   HOWTO (R_ALPHA_GPRELLOW,
720 	 0,			/* rightshift */
721 	 2,			/* size */
722 	 16,			/* bitsize */
723 	 false,			/* pc_relative */
724 	 0,			/* bitpos */
725 	 complain_overflow_dont, /* complain_on_overflow */
726 	 bfd_elf_generic_reloc,	/* special_function */
727 	 "GPRELLOW",		/* name */
728 	 false,			/* partial_inplace */
729 	 0xffff,		/* src_mask */
730 	 0xffff,		/* dst_mask */
731 	 false),		/* pcrel_offset */
732 
733   /* A 16-bit displacement from the GP to the target.  */
734   HOWTO (R_ALPHA_GPREL16,
735 	 0,			/* rightshift */
736 	 2,			/* size */
737 	 16,			/* bitsize */
738 	 false,			/* pc_relative */
739 	 0,			/* bitpos */
740 	 complain_overflow_signed, /* complain_on_overflow */
741 	 bfd_elf_generic_reloc,	/* special_function */
742 	 "GPREL16",		/* name */
743 	 false,			/* partial_inplace */
744 	 0xffff,		/* src_mask */
745 	 0xffff,		/* dst_mask */
746 	 false),		/* pcrel_offset */
747 
748   /* Skip 20 - 23; deprecated ECOFF relocs.  */
749   SKIP_HOWTO (20),
750   SKIP_HOWTO (21),
751   SKIP_HOWTO (22),
752   SKIP_HOWTO (23),
753 
754   /* Misc ELF relocations.  */
755 
756   /* A dynamic relocation to copy the target into our .dynbss section.  */
757   /* Not generated, as all Alpha objects use PIC, so it is not needed.  It
758      is present because every other ELF has one, but should not be used
759      because .dynbss is an ugly thing.  */
760   HOWTO (R_ALPHA_COPY,
761 	 0,
762 	 0,
763 	 0,
764 	 false,
765 	 0,
766 	 complain_overflow_dont,
767 	 bfd_elf_generic_reloc,
768 	 "COPY",
769 	 false,
770 	 0,
771 	 0,
772 	 true),
773 
774   /* A dynamic relocation for a .got entry.  */
775   HOWTO (R_ALPHA_GLOB_DAT,
776 	 0,
777 	 0,
778 	 0,
779 	 false,
780 	 0,
781 	 complain_overflow_dont,
782 	 bfd_elf_generic_reloc,
783 	 "GLOB_DAT",
784 	 false,
785 	 0,
786 	 0,
787 	 true),
788 
789   /* A dynamic relocation for a .plt entry.  */
790   HOWTO (R_ALPHA_JMP_SLOT,
791 	 0,
792 	 0,
793 	 0,
794 	 false,
795 	 0,
796 	 complain_overflow_dont,
797 	 bfd_elf_generic_reloc,
798 	 "JMP_SLOT",
799 	 false,
800 	 0,
801 	 0,
802 	 true),
803 
804   /* A dynamic relocation to add the base of the DSO to a 64-bit field.  */
805   HOWTO (R_ALPHA_RELATIVE,
806 	 0,
807 	 0,
808 	 0,
809 	 false,
810 	 0,
811 	 complain_overflow_dont,
812 	 bfd_elf_generic_reloc,
813 	 "RELATIVE",
814 	 false,
815 	 0,
816 	 0,
817 	 true),
818 
819   /* A 21 bit branch that adjusts for gp loads.  */
820   HOWTO (R_ALPHA_BRSGP,		/* type */
821 	 2,			/* rightshift */
822 	 4,			/* size */
823 	 21,			/* bitsize */
824 	 true,			/* pc_relative */
825 	 0,			/* bitpos */
826 	 complain_overflow_signed, /* complain_on_overflow */
827 	 bfd_elf_generic_reloc,	/* special_function */
828 	 "BRSGP",		/* name */
829 	 false,			/* partial_inplace */
830 	 0x1fffff,		/* src_mask */
831 	 0x1fffff,		/* dst_mask */
832 	 true),			/* pcrel_offset */
833 
834   /* Creates a tls_index for the symbol in the got.  */
835   HOWTO (R_ALPHA_TLSGD,		/* type */
836 	 0,			/* rightshift */
837 	 2,			/* size */
838 	 16,			/* bitsize */
839 	 false,			/* pc_relative */
840 	 0,			/* bitpos */
841 	 complain_overflow_signed, /* complain_on_overflow */
842 	 bfd_elf_generic_reloc,	/* special_function */
843 	 "TLSGD",		/* name */
844 	 false,			/* partial_inplace */
845 	 0xffff,		/* src_mask */
846 	 0xffff,		/* dst_mask */
847 	 false),		/* pcrel_offset */
848 
849   /* Creates a tls_index for the (current) module in the got.  */
850   HOWTO (R_ALPHA_TLSLDM,	/* type */
851 	 0,			/* rightshift */
852 	 2,			/* size */
853 	 16,			/* bitsize */
854 	 false,			/* pc_relative */
855 	 0,			/* bitpos */
856 	 complain_overflow_signed, /* complain_on_overflow */
857 	 bfd_elf_generic_reloc,	/* special_function */
858 	 "TLSLDM",		/* name */
859 	 false,			/* partial_inplace */
860 	 0xffff,		/* src_mask */
861 	 0xffff,		/* dst_mask */
862 	 false),		/* pcrel_offset */
863 
864   /* A dynamic relocation for a DTP module entry.  */
865   HOWTO (R_ALPHA_DTPMOD64,	/* type */
866 	 0,			/* rightshift */
867 	 8,			/* size */
868 	 64,			/* bitsize */
869 	 false,			/* pc_relative */
870 	 0,			/* bitpos */
871 	 complain_overflow_bitfield, /* complain_on_overflow */
872 	 bfd_elf_generic_reloc,	/* special_function */
873 	 "DTPMOD64",		/* name */
874 	 false,			/* partial_inplace */
875 	 MINUS_ONE,		/* src_mask */
876 	 MINUS_ONE,		/* dst_mask */
877 	 false),		/* pcrel_offset */
878 
879   /* Creates a 64-bit offset in the got for the displacement
880      from DTP to the target.  */
881   HOWTO (R_ALPHA_GOTDTPREL,	/* type */
882 	 0,			/* rightshift */
883 	 2,			/* size */
884 	 16,			/* bitsize */
885 	 false,			/* pc_relative */
886 	 0,			/* bitpos */
887 	 complain_overflow_signed, /* complain_on_overflow */
888 	 bfd_elf_generic_reloc,	/* special_function */
889 	 "GOTDTPREL",		/* name */
890 	 false,			/* partial_inplace */
891 	 0xffff,		/* src_mask */
892 	 0xffff,		/* dst_mask */
893 	 false),		/* pcrel_offset */
894 
895   /* A dynamic relocation for a displacement from DTP to the target.  */
896   HOWTO (R_ALPHA_DTPREL64,	/* type */
897 	 0,			/* rightshift */
898 	 8,			/* size */
899 	 64,			/* bitsize */
900 	 false,			/* pc_relative */
901 	 0,			/* bitpos */
902 	 complain_overflow_bitfield, /* complain_on_overflow */
903 	 bfd_elf_generic_reloc,	/* special_function */
904 	 "DTPREL64",		/* name */
905 	 false,			/* partial_inplace */
906 	 MINUS_ONE,		/* src_mask */
907 	 MINUS_ONE,		/* dst_mask */
908 	 false),		/* pcrel_offset */
909 
910   /* The high 16 bits of the displacement from DTP to the target.  */
911   HOWTO (R_ALPHA_DTPRELHI,	/* type */
912 	 0,			/* rightshift */
913 	 2,			/* size */
914 	 16,			/* bitsize */
915 	 false,			/* pc_relative */
916 	 0,			/* bitpos */
917 	 complain_overflow_signed, /* complain_on_overflow */
918 	 bfd_elf_generic_reloc,	/* special_function */
919 	 "DTPRELHI",		/* name */
920 	 false,			/* partial_inplace */
921 	 0xffff,		/* src_mask */
922 	 0xffff,		/* dst_mask */
923 	 false),		/* pcrel_offset */
924 
925   /* The low 16 bits of the displacement from DTP to the target.  */
926   HOWTO (R_ALPHA_DTPRELLO,	/* type */
927 	 0,			/* rightshift */
928 	 2,			/* size */
929 	 16,			/* bitsize */
930 	 false,			/* pc_relative */
931 	 0,			/* bitpos */
932 	 complain_overflow_dont, /* complain_on_overflow */
933 	 bfd_elf_generic_reloc,	/* special_function */
934 	 "DTPRELLO",		/* name */
935 	 false,			/* partial_inplace */
936 	 0xffff,		/* src_mask */
937 	 0xffff,		/* dst_mask */
938 	 false),		/* pcrel_offset */
939 
940   /* A 16-bit displacement from DTP to the target.  */
941   HOWTO (R_ALPHA_DTPREL16,	/* type */
942 	 0,			/* rightshift */
943 	 2,			/* size */
944 	 16,			/* bitsize */
945 	 false,			/* pc_relative */
946 	 0,			/* bitpos */
947 	 complain_overflow_signed, /* complain_on_overflow */
948 	 bfd_elf_generic_reloc,	/* special_function */
949 	 "DTPREL16",		/* name */
950 	 false,			/* partial_inplace */
951 	 0xffff,		/* src_mask */
952 	 0xffff,		/* dst_mask */
953 	 false),		/* pcrel_offset */
954 
955   /* Creates a 64-bit offset in the got for the displacement
956      from TP to the target.  */
957   HOWTO (R_ALPHA_GOTTPREL,	/* type */
958 	 0,			/* rightshift */
959 	 2,			/* size */
960 	 16,			/* bitsize */
961 	 false,			/* pc_relative */
962 	 0,			/* bitpos */
963 	 complain_overflow_signed, /* complain_on_overflow */
964 	 bfd_elf_generic_reloc,	/* special_function */
965 	 "GOTTPREL",		/* name */
966 	 false,			/* partial_inplace */
967 	 0xffff,		/* src_mask */
968 	 0xffff,		/* dst_mask */
969 	 false),		/* pcrel_offset */
970 
971   /* A dynamic relocation for a displacement from TP to the target.  */
972   HOWTO (R_ALPHA_TPREL64,	/* type */
973 	 0,			/* rightshift */
974 	 8,			/* size */
975 	 64,			/* bitsize */
976 	 false,			/* pc_relative */
977 	 0,			/* bitpos */
978 	 complain_overflow_bitfield, /* complain_on_overflow */
979 	 bfd_elf_generic_reloc,	/* special_function */
980 	 "TPREL64",		/* name */
981 	 false,			/* partial_inplace */
982 	 MINUS_ONE,		/* src_mask */
983 	 MINUS_ONE,		/* dst_mask */
984 	 false),		/* pcrel_offset */
985 
986   /* The high 16 bits of the displacement from TP to the target.  */
987   HOWTO (R_ALPHA_TPRELHI,	/* type */
988 	 0,			/* rightshift */
989 	 2,			/* size */
990 	 16,			/* bitsize */
991 	 false,			/* pc_relative */
992 	 0,			/* bitpos */
993 	 complain_overflow_signed, /* complain_on_overflow */
994 	 bfd_elf_generic_reloc,	/* special_function */
995 	 "TPRELHI",		/* name */
996 	 false,			/* partial_inplace */
997 	 0xffff,		/* src_mask */
998 	 0xffff,		/* dst_mask */
999 	 false),		/* pcrel_offset */
1000 
1001   /* The low 16 bits of the displacement from TP to the target.  */
1002   HOWTO (R_ALPHA_TPRELLO,	/* type */
1003 	 0,			/* rightshift */
1004 	 2,			/* size */
1005 	 16,			/* bitsize */
1006 	 false,			/* pc_relative */
1007 	 0,			/* bitpos */
1008 	 complain_overflow_dont, /* complain_on_overflow */
1009 	 bfd_elf_generic_reloc,	/* special_function */
1010 	 "TPRELLO",		/* name */
1011 	 false,			/* partial_inplace */
1012 	 0xffff,		/* src_mask */
1013 	 0xffff,		/* dst_mask */
1014 	 false),		/* pcrel_offset */
1015 
1016   /* A 16-bit displacement from TP to the target.  */
1017   HOWTO (R_ALPHA_TPREL16,	/* type */
1018 	 0,			/* rightshift */
1019 	 2,			/* size */
1020 	 16,			/* bitsize */
1021 	 false,			/* pc_relative */
1022 	 0,			/* bitpos */
1023 	 complain_overflow_signed, /* complain_on_overflow */
1024 	 bfd_elf_generic_reloc,	/* special_function */
1025 	 "TPREL16",		/* name */
1026 	 false,			/* partial_inplace */
1027 	 0xffff,		/* src_mask */
1028 	 0xffff,		/* dst_mask */
1029 	 false),		/* pcrel_offset */
1030 };
1031 
1032 /* A mapping from BFD reloc types to Alpha ELF reloc types.  */
1033 
1034 struct elf_reloc_map
1035 {
1036   bfd_reloc_code_real_type bfd_reloc_val;
1037   int elf_reloc_val;
1038 };
1039 
1040 static const struct elf_reloc_map elf64_alpha_reloc_map[] =
1041 {
1042   {BFD_RELOC_NONE,			R_ALPHA_NONE},
1043   {BFD_RELOC_32,			R_ALPHA_REFLONG},
1044   {BFD_RELOC_64,			R_ALPHA_REFQUAD},
1045   {BFD_RELOC_CTOR,			R_ALPHA_REFQUAD},
1046   {BFD_RELOC_GPREL32,			R_ALPHA_GPREL32},
1047   {BFD_RELOC_ALPHA_ELF_LITERAL,		R_ALPHA_LITERAL},
1048   {BFD_RELOC_ALPHA_LITUSE,		R_ALPHA_LITUSE},
1049   {BFD_RELOC_ALPHA_GPDISP,		R_ALPHA_GPDISP},
1050   {BFD_RELOC_23_PCREL_S2,		R_ALPHA_BRADDR},
1051   {BFD_RELOC_ALPHA_HINT,		R_ALPHA_HINT},
1052   {BFD_RELOC_16_PCREL,			R_ALPHA_SREL16},
1053   {BFD_RELOC_32_PCREL,			R_ALPHA_SREL32},
1054   {BFD_RELOC_64_PCREL,			R_ALPHA_SREL64},
1055   {BFD_RELOC_ALPHA_GPREL_HI16,		R_ALPHA_GPRELHIGH},
1056   {BFD_RELOC_ALPHA_GPREL_LO16,		R_ALPHA_GPRELLOW},
1057   {BFD_RELOC_GPREL16,			R_ALPHA_GPREL16},
1058   {BFD_RELOC_ALPHA_BRSGP,		R_ALPHA_BRSGP},
1059   {BFD_RELOC_ALPHA_TLSGD,		R_ALPHA_TLSGD},
1060   {BFD_RELOC_ALPHA_TLSLDM,		R_ALPHA_TLSLDM},
1061   {BFD_RELOC_ALPHA_DTPMOD64,		R_ALPHA_DTPMOD64},
1062   {BFD_RELOC_ALPHA_GOTDTPREL16,		R_ALPHA_GOTDTPREL},
1063   {BFD_RELOC_ALPHA_DTPREL64,		R_ALPHA_DTPREL64},
1064   {BFD_RELOC_ALPHA_DTPREL_HI16,		R_ALPHA_DTPRELHI},
1065   {BFD_RELOC_ALPHA_DTPREL_LO16,		R_ALPHA_DTPRELLO},
1066   {BFD_RELOC_ALPHA_DTPREL16,		R_ALPHA_DTPREL16},
1067   {BFD_RELOC_ALPHA_GOTTPREL16,		R_ALPHA_GOTTPREL},
1068   {BFD_RELOC_ALPHA_TPREL64,		R_ALPHA_TPREL64},
1069   {BFD_RELOC_ALPHA_TPREL_HI16,		R_ALPHA_TPRELHI},
1070   {BFD_RELOC_ALPHA_TPREL_LO16,		R_ALPHA_TPRELLO},
1071   {BFD_RELOC_ALPHA_TPREL16,		R_ALPHA_TPREL16},
1072 };
1073 
1074 /* Given a BFD reloc type, return a HOWTO structure.  */
1075 
1076 static reloc_howto_type *
1077 elf64_alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1078 				   bfd_reloc_code_real_type code)
1079 {
1080   const struct elf_reloc_map *i, *e;
1081   i = e = elf64_alpha_reloc_map;
1082   e += sizeof (elf64_alpha_reloc_map) / sizeof (struct elf_reloc_map);
1083   for (; i != e; ++i)
1084     {
1085       if (i->bfd_reloc_val == code)
1086 	return &elf64_alpha_howto_table[i->elf_reloc_val];
1087     }
1088   return 0;
1089 }
1090 
1091 static reloc_howto_type *
1092 elf64_alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1093 				   const char *r_name)
1094 {
1095   unsigned int i;
1096 
1097   for (i = 0;
1098        i < (sizeof (elf64_alpha_howto_table)
1099 	    / sizeof (elf64_alpha_howto_table[0]));
1100        i++)
1101     if (elf64_alpha_howto_table[i].name != NULL
1102 	&& strcasecmp (elf64_alpha_howto_table[i].name, r_name) == 0)
1103       return &elf64_alpha_howto_table[i];
1104 
1105   return NULL;
1106 }
1107 
1108 /* Given an Alpha ELF reloc type, fill in an arelent structure.  */
1109 
1110 static bool
1111 elf64_alpha_info_to_howto (bfd *abfd, arelent *cache_ptr,
1112 			   Elf_Internal_Rela *dst)
1113 {
1114   unsigned r_type = ELF64_R_TYPE(dst->r_info);
1115 
1116   if (r_type >= R_ALPHA_max)
1117     {
1118       /* xgettext:c-format */
1119       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1120 			  abfd, r_type);
1121       bfd_set_error (bfd_error_bad_value);
1122       return false;
1123     }
1124   cache_ptr->howto = &elf64_alpha_howto_table[r_type];
1125   return true;
1126 }
1127 
1128 /* These two relocations create a two-word entry in the got.  */
1129 #define alpha_got_entry_size(r_type) \
1130   (r_type == R_ALPHA_TLSGD || r_type == R_ALPHA_TLSLDM ? 16 : 8)
1131 
1132 /* This is PT_TLS segment p_vaddr.  */
1133 #define alpha_get_dtprel_base(info) \
1134   (elf_hash_table (info)->tls_sec->vma)
1135 
1136 /* Main program TLS (whose template starts at PT_TLS p_vaddr)
1137    is assigned offset round(16, PT_TLS p_align).  */
1138 #define alpha_get_tprel_base(info) \
1139   (elf_hash_table (info)->tls_sec->vma					\
1140    - align_power ((bfd_vma) 16,						\
1141 		  elf_hash_table (info)->tls_sec->alignment_power))
1142 
1143 /* Handle an Alpha specific section when reading an object file.  This
1144    is called when bfd_section_from_shdr finds a section with an unknown
1145    type.  */
1146 
1147 static bool
1148 elf64_alpha_section_from_shdr (bfd *abfd,
1149 			       Elf_Internal_Shdr *hdr,
1150 			       const char *name,
1151 			       int shindex)
1152 {
1153   asection *newsect;
1154 
1155   /* There ought to be a place to keep ELF backend specific flags, but
1156      at the moment there isn't one.  We just keep track of the
1157      sections by their name, instead.  Fortunately, the ABI gives
1158      suggested names for all the MIPS specific sections, so we will
1159      probably get away with this.  */
1160   switch (hdr->sh_type)
1161     {
1162     case SHT_ALPHA_DEBUG:
1163       if (strcmp (name, ".mdebug") != 0)
1164 	return false;
1165       break;
1166     default:
1167       return false;
1168     }
1169 
1170   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1171     return false;
1172   newsect = hdr->bfd_section;
1173 
1174   if (hdr->sh_type == SHT_ALPHA_DEBUG)
1175     {
1176       if (!bfd_set_section_flags (newsect,
1177 				  bfd_section_flags (newsect) | SEC_DEBUGGING))
1178 	return false;
1179     }
1180 
1181   return true;
1182 }
1183 
1184 /* Convert Alpha specific section flags to bfd internal section flags.  */
1185 
1186 static bool
1187 elf64_alpha_section_flags (const Elf_Internal_Shdr *hdr)
1188 {
1189   if (hdr->sh_flags & SHF_ALPHA_GPREL)
1190     hdr->bfd_section->flags |= SEC_SMALL_DATA;
1191 
1192   return true;
1193 }
1194 
1195 /* Set the correct type for an Alpha ELF section.  We do this by the
1196    section name, which is a hack, but ought to work.  */
1197 
1198 static bool
1199 elf64_alpha_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
1200 {
1201   register const char *name;
1202 
1203   name = bfd_section_name (sec);
1204 
1205   if (strcmp (name, ".mdebug") == 0)
1206     {
1207       hdr->sh_type = SHT_ALPHA_DEBUG;
1208       /* In a shared object on Irix 5.3, the .mdebug section has an
1209 	 entsize of 0.  FIXME: Does this matter?  */
1210       if ((abfd->flags & DYNAMIC) != 0 )
1211 	hdr->sh_entsize = 0;
1212       else
1213 	hdr->sh_entsize = 1;
1214     }
1215   else if ((sec->flags & SEC_SMALL_DATA)
1216 	   || strcmp (name, ".sdata") == 0
1217 	   || strcmp (name, ".sbss") == 0
1218 	   || strcmp (name, ".lit4") == 0
1219 	   || strcmp (name, ".lit8") == 0)
1220     hdr->sh_flags |= SHF_ALPHA_GPREL;
1221 
1222   return true;
1223 }
1224 
1225 /* Hook called by the linker routine which adds symbols from an object
1226    file.  We use it to put .comm items in .sbss, and not .bss.  */
1227 
1228 static bool
1229 elf64_alpha_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
1230 			     Elf_Internal_Sym *sym,
1231 			     const char **namep ATTRIBUTE_UNUSED,
1232 			     flagword *flagsp ATTRIBUTE_UNUSED,
1233 			     asection **secp, bfd_vma *valp)
1234 {
1235   if (sym->st_shndx == SHN_COMMON
1236       && !bfd_link_relocatable (info)
1237       && sym->st_size <= elf_gp_size (abfd))
1238     {
1239       /* Common symbols less than or equal to -G nn bytes are
1240 	 automatically put into .sbss.  */
1241 
1242       asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
1243 
1244       if (scomm == NULL)
1245 	{
1246 	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
1247 					       (SEC_ALLOC
1248 						| SEC_IS_COMMON
1249 						| SEC_SMALL_DATA
1250 						| SEC_LINKER_CREATED));
1251 	  if (scomm == NULL)
1252 	    return false;
1253 	}
1254 
1255       *secp = scomm;
1256       *valp = sym->st_size;
1257     }
1258 
1259   return true;
1260 }
1261 
1262 /* Create the .got section.  */
1263 
1264 static bool
1265 elf64_alpha_create_got_section (bfd *abfd,
1266 				struct bfd_link_info *info ATTRIBUTE_UNUSED)
1267 {
1268   flagword flags;
1269   asection *s;
1270 
1271   if (! is_alpha_elf (abfd))
1272     return false;
1273 
1274   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1275 	   | SEC_LINKER_CREATED);
1276   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
1277   if (s == NULL
1278       || !bfd_set_section_alignment (s, 3))
1279     return false;
1280 
1281   alpha_elf_tdata (abfd)->got = s;
1282 
1283   /* Make sure the object's gotobj is set to itself so that we default
1284      to every object with its own .got.  We'll merge .gots later once
1285      we've collected each object's info.  */
1286   alpha_elf_tdata (abfd)->gotobj = abfd;
1287 
1288   return true;
1289 }
1290 
1291 /* Create all the dynamic sections.  */
1292 
1293 static bool
1294 elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
1295 {
1296   asection *s;
1297   flagword flags;
1298   struct elf_link_hash_entry *h;
1299 
1300   if (! is_alpha_elf (abfd))
1301     return false;
1302 
1303   /* We need to create .plt, .rela.plt, .got, and .rela.got sections.  */
1304 
1305   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1306 	   | SEC_LINKER_CREATED
1307 	   | (elf64_alpha_use_secureplt ? SEC_READONLY : 0));
1308   s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags);
1309   elf_hash_table (info)->splt = s;
1310   if (s == NULL || ! bfd_set_section_alignment (s, 4))
1311     return false;
1312 
1313   /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
1314      .plt section.  */
1315   h = _bfd_elf_define_linkage_sym (abfd, info, s,
1316 				   "_PROCEDURE_LINKAGE_TABLE_");
1317   elf_hash_table (info)->hplt = h;
1318   if (h == NULL)
1319     return false;
1320 
1321   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1322 	   | SEC_LINKER_CREATED | SEC_READONLY);
1323   s = bfd_make_section_anyway_with_flags (abfd, ".rela.plt", flags);
1324   elf_hash_table (info)->srelplt = s;
1325   if (s == NULL || ! bfd_set_section_alignment (s, 3))
1326     return false;
1327 
1328   if (elf64_alpha_use_secureplt)
1329     {
1330       flags = SEC_ALLOC | SEC_LINKER_CREATED;
1331       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
1332       elf_hash_table (info)->sgotplt = s;
1333       if (s == NULL || ! bfd_set_section_alignment (s, 3))
1334 	return false;
1335     }
1336 
1337   /* We may or may not have created a .got section for this object, but
1338      we definitely havn't done the rest of the work.  */
1339 
1340   if (alpha_elf_tdata(abfd)->gotobj == NULL)
1341     {
1342       if (!elf64_alpha_create_got_section (abfd, info))
1343 	return false;
1344     }
1345 
1346   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1347 	   | SEC_LINKER_CREATED | SEC_READONLY);
1348   s = bfd_make_section_anyway_with_flags (abfd, ".rela.got", flags);
1349   elf_hash_table (info)->srelgot = s;
1350   if (s == NULL
1351       || !bfd_set_section_alignment (s, 3))
1352     return false;
1353 
1354   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
1355      dynobj's .got section.  We don't do this in the linker script
1356      because we don't want to define the symbol if we are not creating
1357      a global offset table.  */
1358   h = _bfd_elf_define_linkage_sym (abfd, info, alpha_elf_tdata(abfd)->got,
1359 				   "_GLOBAL_OFFSET_TABLE_");
1360   elf_hash_table (info)->hgot = h;
1361   if (h == NULL)
1362     return false;
1363 
1364   return true;
1365 }
1366 
1367 /* Read ECOFF debugging information from a .mdebug section into a
1368    ecoff_debug_info structure.  */
1369 
1370 static bool
1371 elf64_alpha_read_ecoff_info (bfd *abfd, asection *section,
1372 			     struct ecoff_debug_info *debug)
1373 {
1374   HDRR *symhdr;
1375   const struct ecoff_debug_swap *swap;
1376   char *ext_hdr = NULL;
1377 
1378   swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1379   memset (debug, 0, sizeof (*debug));
1380 
1381   ext_hdr = (char *) bfd_malloc (swap->external_hdr_size);
1382   if (ext_hdr == NULL && swap->external_hdr_size != 0)
1383     goto error_return;
1384 
1385   if (! bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
1386 				  swap->external_hdr_size))
1387     goto error_return;
1388 
1389   symhdr = &debug->symbolic_header;
1390   (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1391 
1392   /* The symbolic header contains absolute file offsets and sizes to
1393      read.  */
1394 #define READ(ptr, offset, count, size, type)				\
1395   do									\
1396     {									\
1397       size_t amt;							\
1398       debug->ptr = NULL;						\
1399       if (symhdr->count == 0)						\
1400 	break;								\
1401       if (_bfd_mul_overflow (size, symhdr->count, &amt))		\
1402 	{								\
1403 	  bfd_set_error (bfd_error_file_too_big);			\
1404 	  goto error_return;						\
1405 	}								\
1406       if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0)		\
1407 	goto error_return;						\
1408       debug->ptr = (type) _bfd_malloc_and_read (abfd, amt, amt);	\
1409       if (debug->ptr == NULL)						\
1410 	goto error_return;						\
1411     } while (0)
1412 
1413   READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
1414   READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
1415   READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
1416   READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
1417   READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
1418   READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1419 	union aux_ext *);
1420   READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1421   READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
1422   READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
1423   READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
1424   READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
1425 #undef READ
1426 
1427   debug->fdr = NULL;
1428 
1429   return true;
1430 
1431  error_return:
1432   free (ext_hdr);
1433   free (debug->line);
1434   free (debug->external_dnr);
1435   free (debug->external_pdr);
1436   free (debug->external_sym);
1437   free (debug->external_opt);
1438   free (debug->external_aux);
1439   free (debug->ss);
1440   free (debug->ssext);
1441   free (debug->external_fdr);
1442   free (debug->external_rfd);
1443   free (debug->external_ext);
1444   return false;
1445 }
1446 
1447 /* Alpha ELF local labels start with '$'.  */
1448 
1449 static bool
1450 elf64_alpha_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1451 {
1452   return name[0] == '$';
1453 }
1454 
1455 static bool
1456 elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols,
1457 			       asection *section, bfd_vma offset,
1458 			       const char **filename_ptr,
1459 			       const char **functionname_ptr,
1460 			       unsigned int *line_ptr,
1461 			       unsigned int *discriminator_ptr)
1462 {
1463   asection *msec;
1464 
1465   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
1466 				     filename_ptr, functionname_ptr,
1467 				     line_ptr, discriminator_ptr,
1468 				     dwarf_debug_sections,
1469 				     &elf_tdata (abfd)->dwarf2_find_line_info)
1470       == 1)
1471     return true;
1472 
1473   msec = bfd_get_section_by_name (abfd, ".mdebug");
1474   if (msec != NULL)
1475     {
1476       flagword origflags;
1477       struct alpha_elf_find_line *fi;
1478       const struct ecoff_debug_swap * const swap =
1479 	get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1480 
1481       /* If we are called during a link, alpha_elf_final_link may have
1482 	 cleared the SEC_HAS_CONTENTS field.  We force it back on here
1483 	 if appropriate (which it normally will be).  */
1484       origflags = msec->flags;
1485       if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
1486 	msec->flags |= SEC_HAS_CONTENTS;
1487 
1488       fi = alpha_elf_tdata (abfd)->find_line_info;
1489       if (fi == NULL)
1490 	{
1491 	  bfd_size_type external_fdr_size;
1492 	  char *fraw_src;
1493 	  char *fraw_end;
1494 	  struct fdr *fdr_ptr;
1495 	  bfd_size_type amt = sizeof (struct alpha_elf_find_line);
1496 
1497 	  fi = (struct alpha_elf_find_line *) bfd_zalloc (abfd, amt);
1498 	  if (fi == NULL)
1499 	    {
1500 	      msec->flags = origflags;
1501 	      return false;
1502 	    }
1503 
1504 	  if (!elf64_alpha_read_ecoff_info (abfd, msec, &fi->d))
1505 	    {
1506 	      msec->flags = origflags;
1507 	      return false;
1508 	    }
1509 
1510 	  /* Swap in the FDR information.  */
1511 	  amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
1512 	  fi->d.fdr = (struct fdr *) bfd_alloc (abfd, amt);
1513 	  if (fi->d.fdr == NULL)
1514 	    {
1515 	      msec->flags = origflags;
1516 	      return false;
1517 	    }
1518 	  external_fdr_size = swap->external_fdr_size;
1519 	  fdr_ptr = fi->d.fdr;
1520 	  fraw_src = (char *) fi->d.external_fdr;
1521 	  fraw_end = (fraw_src
1522 		      + fi->d.symbolic_header.ifdMax * external_fdr_size);
1523 	  for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
1524 	    (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
1525 
1526 	  alpha_elf_tdata (abfd)->find_line_info = fi;
1527 
1528 	  /* Note that we don't bother to ever free this information.
1529 	     find_nearest_line is either called all the time, as in
1530 	     objdump -l, so the information should be saved, or it is
1531 	     rarely called, as in ld error messages, so the memory
1532 	     wasted is unimportant.  Still, it would probably be a
1533 	     good idea for free_cached_info to throw it away.  */
1534 	}
1535 
1536       if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
1537 				  &fi->i, filename_ptr, functionname_ptr,
1538 				  line_ptr))
1539 	{
1540 	  msec->flags = origflags;
1541 	  return true;
1542 	}
1543 
1544       msec->flags = origflags;
1545     }
1546 
1547   /* Fall back on the generic ELF find_nearest_line routine.  */
1548 
1549   return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
1550 				     filename_ptr, functionname_ptr,
1551 				     line_ptr, discriminator_ptr);
1552 }
1553 
1554 /* Structure used to pass information to alpha_elf_output_extsym.  */
1555 
1556 struct extsym_info
1557 {
1558   bfd *abfd;
1559   struct bfd_link_info *info;
1560   struct ecoff_debug_info *debug;
1561   const struct ecoff_debug_swap *swap;
1562   bool failed;
1563 };
1564 
1565 static bool
1566 elf64_alpha_output_extsym (struct elf_link_hash_entry *x, void * data)
1567 {
1568   struct alpha_elf_link_hash_entry *h = (struct alpha_elf_link_hash_entry *) x;
1569   struct extsym_info *einfo = (struct extsym_info *) data;
1570   bool strip;
1571   asection *sec, *output_section;
1572 
1573   if (h->root.indx == -2)
1574     strip = false;
1575   else if ((h->root.def_dynamic
1576 	    || h->root.ref_dynamic
1577 	    || h->root.root.type == bfd_link_hash_new)
1578 	   && !h->root.def_regular
1579 	   && !h->root.ref_regular)
1580     strip = true;
1581   else if (einfo->info->strip == strip_all
1582 	   || (einfo->info->strip == strip_some
1583 	       && bfd_hash_lookup (einfo->info->keep_hash,
1584 				   h->root.root.root.string,
1585 				   false, false) == NULL))
1586     strip = true;
1587   else
1588     strip = false;
1589 
1590   if (strip)
1591     return true;
1592 
1593   if (h->esym.ifd == -2)
1594     {
1595       h->esym.jmptbl = 0;
1596       h->esym.cobol_main = 0;
1597       h->esym.weakext = 0;
1598       h->esym.reserved = 0;
1599       h->esym.ifd = ifdNil;
1600       h->esym.asym.value = 0;
1601       h->esym.asym.st = stGlobal;
1602 
1603       if (h->root.root.type != bfd_link_hash_defined
1604 	  && h->root.root.type != bfd_link_hash_defweak)
1605 	h->esym.asym.sc = scAbs;
1606       else
1607 	{
1608 	  const char *name;
1609 
1610 	  sec = h->root.root.u.def.section;
1611 	  output_section = sec->output_section;
1612 
1613 	  /* When making a shared library and symbol h is the one from
1614 	     the another shared library, OUTPUT_SECTION may be null.  */
1615 	  if (output_section == NULL)
1616 	    h->esym.asym.sc = scUndefined;
1617 	  else
1618 	    {
1619 	      name = bfd_section_name (output_section);
1620 
1621 	      if (strcmp (name, ".text") == 0)
1622 		h->esym.asym.sc = scText;
1623 	      else if (strcmp (name, ".data") == 0)
1624 		h->esym.asym.sc = scData;
1625 	      else if (strcmp (name, ".sdata") == 0)
1626 		h->esym.asym.sc = scSData;
1627 	      else if (strcmp (name, ".rodata") == 0
1628 		       || strcmp (name, ".rdata") == 0)
1629 		h->esym.asym.sc = scRData;
1630 	      else if (strcmp (name, ".bss") == 0)
1631 		h->esym.asym.sc = scBss;
1632 	      else if (strcmp (name, ".sbss") == 0)
1633 		h->esym.asym.sc = scSBss;
1634 	      else if (strcmp (name, ".init") == 0)
1635 		h->esym.asym.sc = scInit;
1636 	      else if (strcmp (name, ".fini") == 0)
1637 		h->esym.asym.sc = scFini;
1638 	      else
1639 		h->esym.asym.sc = scAbs;
1640 	    }
1641 	}
1642 
1643       h->esym.asym.reserved = 0;
1644       h->esym.asym.index = indexNil;
1645     }
1646 
1647   if (h->root.root.type == bfd_link_hash_common)
1648     h->esym.asym.value = h->root.root.u.c.size;
1649   else if (h->root.root.type == bfd_link_hash_defined
1650 	   || h->root.root.type == bfd_link_hash_defweak)
1651     {
1652       if (h->esym.asym.sc == scCommon)
1653 	h->esym.asym.sc = scBss;
1654       else if (h->esym.asym.sc == scSCommon)
1655 	h->esym.asym.sc = scSBss;
1656 
1657       sec = h->root.root.u.def.section;
1658       output_section = sec->output_section;
1659       if (output_section != NULL)
1660 	h->esym.asym.value = (h->root.root.u.def.value
1661 			      + sec->output_offset
1662 			      + output_section->vma);
1663       else
1664 	h->esym.asym.value = 0;
1665     }
1666 
1667   if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1668 				      h->root.root.root.string,
1669 				      &h->esym))
1670     {
1671       einfo->failed = true;
1672       return false;
1673     }
1674 
1675   return true;
1676 }
1677 
1678 /* Search for and possibly create a got entry.  */
1679 
1680 static struct alpha_elf_got_entry *
1681 get_got_entry (bfd *abfd, struct alpha_elf_link_hash_entry *h,
1682 	       unsigned long r_type, unsigned long r_symndx,
1683 	       bfd_vma r_addend)
1684 {
1685   struct alpha_elf_got_entry *gotent;
1686   struct alpha_elf_got_entry **slot;
1687 
1688   if (h)
1689     slot = &h->got_entries;
1690   else
1691     {
1692       /* This is a local .got entry -- record for merge.  */
1693 
1694       struct alpha_elf_got_entry **local_got_entries;
1695 
1696       local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
1697       if (!local_got_entries)
1698 	{
1699 	  bfd_size_type size;
1700 	  Elf_Internal_Shdr *symtab_hdr;
1701 
1702 	  symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
1703 	  size = symtab_hdr->sh_info;
1704 	  size *= sizeof (struct alpha_elf_got_entry *);
1705 
1706 	  local_got_entries
1707 	    = (struct alpha_elf_got_entry **) bfd_zalloc (abfd, size);
1708 	  if (!local_got_entries)
1709 	    return NULL;
1710 
1711 	  alpha_elf_tdata (abfd)->local_got_entries = local_got_entries;
1712 	}
1713 
1714       slot = &local_got_entries[r_symndx];
1715     }
1716 
1717   for (gotent = *slot; gotent ; gotent = gotent->next)
1718     if (gotent->gotobj == abfd
1719 	&& gotent->reloc_type == r_type
1720 	&& gotent->addend == r_addend)
1721       break;
1722 
1723   if (!gotent)
1724     {
1725       int entry_size;
1726       size_t amt;
1727 
1728       amt = sizeof (struct alpha_elf_got_entry);
1729       gotent = (struct alpha_elf_got_entry *) bfd_alloc (abfd, amt);
1730       if (!gotent)
1731 	return NULL;
1732 
1733       gotent->gotobj = abfd;
1734       gotent->addend = r_addend;
1735       gotent->got_offset = -1;
1736       gotent->plt_offset = -1;
1737       gotent->use_count = 1;
1738       gotent->reloc_type = r_type;
1739       gotent->reloc_done = 0;
1740       gotent->reloc_xlated = 0;
1741 
1742       gotent->next = *slot;
1743       *slot = gotent;
1744 
1745       entry_size = alpha_got_entry_size (r_type);
1746       alpha_elf_tdata (abfd)->total_got_size += entry_size;
1747       if (!h)
1748 	alpha_elf_tdata(abfd)->local_got_size += entry_size;
1749     }
1750   else
1751     gotent->use_count += 1;
1752 
1753   return gotent;
1754 }
1755 
1756 static bool
1757 elf64_alpha_want_plt (struct alpha_elf_link_hash_entry *ah)
1758 {
1759   return ((ah->root.type == STT_FUNC
1760 	  || ah->root.root.type == bfd_link_hash_undefweak
1761 	  || ah->root.root.type == bfd_link_hash_undefined)
1762 	  && (ah->flags & ALPHA_ELF_LINK_HASH_LU_PLT) != 0
1763 	  && (ah->flags & ~ALPHA_ELF_LINK_HASH_LU_PLT) == 0);
1764 }
1765 
1766 /* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
1767    Don't do so for code sections.  We want to keep ordering of LITERAL/LITUSE
1768    as is.  On the other hand, elf-eh-frame.c processing requires .eh_frame
1769    relocs to be sorted.  */
1770 
1771 static bool
1772 elf64_alpha_sort_relocs_p (asection *sec)
1773 {
1774   return (sec->flags & SEC_CODE) == 0;
1775 }
1776 
1777 
1778 /* Handle dynamic relocations when doing an Alpha ELF link.  */
1779 
1780 static bool
1781 elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info,
1782 			  asection *sec, const Elf_Internal_Rela *relocs)
1783 {
1784   bfd *dynobj;
1785   asection *sreloc;
1786   Elf_Internal_Shdr *symtab_hdr;
1787   struct alpha_elf_link_hash_entry **sym_hashes;
1788   const Elf_Internal_Rela *rel, *relend;
1789 
1790   if (bfd_link_relocatable (info))
1791     return true;
1792 
1793   BFD_ASSERT (is_alpha_elf (abfd));
1794 
1795   dynobj = elf_hash_table (info)->dynobj;
1796   if (dynobj == NULL)
1797     elf_hash_table (info)->dynobj = dynobj = abfd;
1798 
1799   sreloc = NULL;
1800   symtab_hdr = &elf_symtab_hdr (abfd);
1801   sym_hashes = alpha_elf_sym_hashes (abfd);
1802 
1803   relend = relocs + sec->reloc_count;
1804   for (rel = relocs; rel < relend; ++rel)
1805     {
1806       enum {
1807 	NEED_GOT = 1,
1808 	NEED_GOT_ENTRY = 2,
1809 	NEED_DYNREL = 4
1810       };
1811 
1812       unsigned long r_symndx, r_type;
1813       struct alpha_elf_link_hash_entry *h;
1814       unsigned int gotent_flags;
1815       bool maybe_dynamic;
1816       unsigned int need;
1817       bfd_vma addend;
1818 
1819       r_symndx = ELF64_R_SYM (rel->r_info);
1820       if (r_symndx < symtab_hdr->sh_info)
1821 	h = NULL;
1822       else
1823 	{
1824 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1825 
1826 	  while (h->root.root.type == bfd_link_hash_indirect
1827 		 || h->root.root.type == bfd_link_hash_warning)
1828 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
1829 
1830 	  /* PR15323, ref flags aren't set for references in the same
1831 	     object.  */
1832 	  h->root.ref_regular = 1;
1833 	}
1834 
1835       /* We can only get preliminary data on whether a symbol is
1836 	 locally or externally defined, as not all of the input files
1837 	 have yet been processed.  Do something with what we know, as
1838 	 this may help reduce memory usage and processing time later.  */
1839       maybe_dynamic = false;
1840       if (h && ((bfd_link_pic (info)
1841 		 && (!info->symbolic
1842 		     || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1843 		|| !h->root.def_regular
1844 		|| h->root.root.type == bfd_link_hash_defweak))
1845 	maybe_dynamic = true;
1846 
1847       need = 0;
1848       gotent_flags = 0;
1849       r_type = ELF64_R_TYPE (rel->r_info);
1850       addend = rel->r_addend;
1851 
1852       switch (r_type)
1853 	{
1854 	case R_ALPHA_LITERAL:
1855 	  need = NEED_GOT | NEED_GOT_ENTRY;
1856 
1857 	  /* Remember how this literal is used from its LITUSEs.
1858 	     This will be important when it comes to decide if we can
1859 	     create a .plt entry for a function symbol.  */
1860 	  while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
1861 	    if (rel->r_addend >= 1 && rel->r_addend <= 6)
1862 	      gotent_flags |= 1 << rel->r_addend;
1863 	  --rel;
1864 
1865 	  /* No LITUSEs -- presumably the address is used somehow.  */
1866 	  if (gotent_flags == 0)
1867 	    gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
1868 	  break;
1869 
1870 	case R_ALPHA_GPDISP:
1871 	case R_ALPHA_GPREL16:
1872 	case R_ALPHA_GPREL32:
1873 	case R_ALPHA_GPRELHIGH:
1874 	case R_ALPHA_GPRELLOW:
1875 	case R_ALPHA_BRSGP:
1876 	  need = NEED_GOT;
1877 	  break;
1878 
1879 	case R_ALPHA_REFLONG:
1880 	case R_ALPHA_REFQUAD:
1881 	  if (bfd_link_pic (info) || maybe_dynamic)
1882 	    need = NEED_DYNREL;
1883 	  break;
1884 
1885 	case R_ALPHA_TLSLDM:
1886 	  /* The symbol for a TLSLDM reloc is ignored.  Collapse the
1887 	     reloc to the STN_UNDEF (0) symbol so that they all match.  */
1888 	  r_symndx = STN_UNDEF;
1889 	  h = 0;
1890 	  maybe_dynamic = false;
1891 	  /* FALLTHRU */
1892 
1893 	case R_ALPHA_TLSGD:
1894 	case R_ALPHA_GOTDTPREL:
1895 	  need = NEED_GOT | NEED_GOT_ENTRY;
1896 	  break;
1897 
1898 	case R_ALPHA_GOTTPREL:
1899 	  need = NEED_GOT | NEED_GOT_ENTRY;
1900 	  gotent_flags = ALPHA_ELF_LINK_HASH_TLS_IE;
1901 	  if (bfd_link_pic (info))
1902 	    info->flags |= DF_STATIC_TLS;
1903 	  break;
1904 
1905 	case R_ALPHA_TPREL64:
1906 	  if (bfd_link_dll (info))
1907 	    {
1908 	      info->flags |= DF_STATIC_TLS;
1909 	      need = NEED_DYNREL;
1910 	    }
1911 	  else if (maybe_dynamic)
1912 	    need = NEED_DYNREL;
1913 	  break;
1914 	}
1915 
1916       if (need & NEED_GOT)
1917 	{
1918 	  if (alpha_elf_tdata(abfd)->gotobj == NULL)
1919 	    {
1920 	      if (!elf64_alpha_create_got_section (abfd, info))
1921 		return false;
1922 	    }
1923 	}
1924 
1925       if (need & NEED_GOT_ENTRY)
1926 	{
1927 	  struct alpha_elf_got_entry *gotent;
1928 
1929 	  gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
1930 	  if (!gotent)
1931 	    return false;
1932 
1933 	  if (gotent_flags)
1934 	    {
1935 	      gotent->flags |= gotent_flags;
1936 	      if (h)
1937 		{
1938 		  gotent_flags |= h->flags;
1939 		  h->flags = gotent_flags;
1940 
1941 		  /* Make a guess as to whether a .plt entry is needed.  */
1942 		  /* ??? It appears that we won't make it into
1943 		     adjust_dynamic_symbol for symbols that remain
1944 		     totally undefined.  Copying this check here means
1945 		     we can create a plt entry for them too.  */
1946 		  h->root.needs_plt
1947 		    = (maybe_dynamic && elf64_alpha_want_plt (h));
1948 		}
1949 	    }
1950 	}
1951 
1952       if (need & NEED_DYNREL)
1953 	{
1954 	  /* We need to create the section here now whether we eventually
1955 	     use it or not so that it gets mapped to an output section by
1956 	     the linker.  If not used, we'll kill it in size_dynamic_sections.  */
1957 	  if (sreloc == NULL)
1958 	    {
1959 	      sreloc = _bfd_elf_make_dynamic_reloc_section
1960 		(sec, dynobj, 3, abfd, /*rela?*/ true);
1961 
1962 	      if (sreloc == NULL)
1963 		return false;
1964 	    }
1965 
1966 	  if (h)
1967 	    {
1968 	      /* Since we havn't seen all of the input symbols yet, we
1969 		 don't know whether we'll actually need a dynamic relocation
1970 		 entry for this reloc.  So make a record of it.  Once we
1971 		 find out if this thing needs dynamic relocation we'll
1972 		 expand the relocation sections by the appropriate amount.  */
1973 
1974 	      struct alpha_elf_reloc_entry *rent;
1975 
1976 	      for (rent = h->reloc_entries; rent; rent = rent->next)
1977 		if (rent->rtype == r_type && rent->srel == sreloc)
1978 		  break;
1979 
1980 	      if (!rent)
1981 		{
1982 		  size_t amt = sizeof (struct alpha_elf_reloc_entry);
1983 		  rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
1984 		  if (!rent)
1985 		    return false;
1986 
1987 		  rent->srel = sreloc;
1988 		  rent->sec = sec;
1989 		  rent->rtype = r_type;
1990 		  rent->count = 1;
1991 
1992 		  rent->next = h->reloc_entries;
1993 		  h->reloc_entries = rent;
1994 		}
1995 	      else
1996 		rent->count++;
1997 	    }
1998 	  else if (bfd_link_pic (info))
1999 	    {
2000 	      /* If this is a shared library, and the section is to be
2001 		 loaded into memory, we need a RELATIVE reloc.  */
2002 	      sreloc->size += sizeof (Elf64_External_Rela);
2003 	      if (sec->flags & SEC_READONLY)
2004 		{
2005 		  info->flags |= DF_TEXTREL;
2006 		  info->callbacks->minfo
2007 		    (_("%pB: dynamic relocation against `%pT' in "
2008 		       "read-only section `%pA'\n"),
2009 		     sec->owner, h->root.root.root.string, sec);
2010 		}
2011 	    }
2012 	}
2013     }
2014 
2015   return true;
2016 }
2017 
2018 /* Return the section that should be marked against GC for a given
2019    relocation.  */
2020 
2021 static asection *
2022 elf64_alpha_gc_mark_hook (asection *sec, struct bfd_link_info *info,
2023 			  Elf_Internal_Rela *rel,
2024 			  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
2025 {
2026   /* These relocations don't really reference a symbol.  Instead we store
2027      extra data in their addend slot.  Ignore the symbol.  */
2028   switch (ELF64_R_TYPE (rel->r_info))
2029     {
2030     case R_ALPHA_LITUSE:
2031     case R_ALPHA_GPDISP:
2032     case R_ALPHA_HINT:
2033       return NULL;
2034     }
2035 
2036   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2037 }
2038 
2039 /* Adjust a symbol defined by a dynamic object and referenced by a
2040    regular object.  The current definition is in some section of the
2041    dynamic object, but we're not including those sections.  We have to
2042    change the definition to something the rest of the link can
2043    understand.  */
2044 
2045 static bool
2046 elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info *info,
2047 				   struct elf_link_hash_entry *h)
2048 {
2049   bfd *dynobj;
2050   asection *s;
2051   struct alpha_elf_link_hash_entry *ah;
2052 
2053   dynobj = elf_hash_table(info)->dynobj;
2054   ah = (struct alpha_elf_link_hash_entry *)h;
2055 
2056   /* Now that we've seen all of the input symbols, finalize our decision
2057      about whether this symbol should get a .plt entry.  Irritatingly, it
2058      is common for folk to leave undefined symbols in shared libraries,
2059      and they still expect lazy binding; accept undefined symbols in lieu
2060      of STT_FUNC.  */
2061   if (alpha_elf_dynamic_symbol_p (h, info) && elf64_alpha_want_plt (ah))
2062     {
2063       h->needs_plt = true;
2064 
2065       s = elf_hash_table(info)->splt;
2066       if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2067 	return false;
2068 
2069       /* We need one plt entry per got subsection.  Delay allocation of
2070 	 the actual plt entries until size_plt_section, called from
2071 	 size_dynamic_sections or during relaxation.  */
2072 
2073       return true;
2074     }
2075   else
2076     h->needs_plt = false;
2077 
2078   /* If this is a weak symbol, and there is a real definition, the
2079      processor independent code will have arranged for us to see the
2080      real definition first, and we can just use the same value.  */
2081   if (h->is_weakalias)
2082     {
2083       struct elf_link_hash_entry *def = weakdef (h);
2084       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2085       h->root.u.def.section = def->root.u.def.section;
2086       h->root.u.def.value = def->root.u.def.value;
2087       return true;
2088     }
2089 
2090   /* This is a reference to a symbol defined by a dynamic object which
2091      is not a function.  The Alpha, since it uses .got entries for all
2092      symbols even in regular objects, does not need the hackery of a
2093      .dynbss section and COPY dynamic relocations.  */
2094 
2095   return true;
2096 }
2097 
2098 /* Record STO_ALPHA_NOPV and STO_ALPHA_STD_GPLOAD.  */
2099 
2100 static void
2101 elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
2102 				    unsigned int st_other,
2103 				    bool definition,
2104 				    bool dynamic)
2105 {
2106   if (!dynamic && definition)
2107     h->other = ((h->other & ELF_ST_VISIBILITY (-1))
2108 		| (st_other & ~ELF_ST_VISIBILITY (-1)));
2109 }
2110 
2111 /* Symbol versioning can create new symbols, and make our old symbols
2112    indirect to the new ones.  Consolidate the got and reloc information
2113    in these situations.  */
2114 
2115 static void
2116 elf64_alpha_copy_indirect_symbol (struct bfd_link_info *info,
2117 				  struct elf_link_hash_entry *dir,
2118 				  struct elf_link_hash_entry *ind)
2119 {
2120   struct alpha_elf_link_hash_entry *hi
2121     = (struct alpha_elf_link_hash_entry *) ind;
2122   struct alpha_elf_link_hash_entry *hs
2123     = (struct alpha_elf_link_hash_entry *) dir;
2124 
2125   /* Do the merging in the superclass.  */
2126   _bfd_elf_link_hash_copy_indirect(info, dir, ind);
2127 
2128   /* Merge the flags.  Whee.  */
2129   hs->flags |= hi->flags;
2130 
2131   /* ??? It's unclear to me what's really supposed to happen when
2132      "merging" defweak and defined symbols, given that we don't
2133      actually throw away the defweak.  This more-or-less copies
2134      the logic related to got and plt entries in the superclass.  */
2135   if (ind->root.type != bfd_link_hash_indirect)
2136     return;
2137 
2138   /* Merge the .got entries.  Cannibalize the old symbol's list in
2139      doing so, since we don't need it anymore.  */
2140 
2141   if (hs->got_entries == NULL)
2142     hs->got_entries = hi->got_entries;
2143   else
2144     {
2145       struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2146 
2147       gsh = hs->got_entries;
2148       for (gi = hi->got_entries; gi ; gi = gin)
2149 	{
2150 	  gin = gi->next;
2151 	  for (gs = gsh; gs ; gs = gs->next)
2152 	    if (gi->gotobj == gs->gotobj
2153 		&& gi->reloc_type == gs->reloc_type
2154 		&& gi->addend == gs->addend)
2155 	      {
2156 		gs->use_count += gi->use_count;
2157 		goto got_found;
2158 	      }
2159 	  gi->next = hs->got_entries;
2160 	  hs->got_entries = gi;
2161 	got_found:;
2162 	}
2163     }
2164   hi->got_entries = NULL;
2165 
2166   /* And similar for the reloc entries.  */
2167 
2168   if (hs->reloc_entries == NULL)
2169     hs->reloc_entries = hi->reloc_entries;
2170   else
2171     {
2172       struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2173 
2174       rsh = hs->reloc_entries;
2175       for (ri = hi->reloc_entries; ri ; ri = rin)
2176 	{
2177 	  rin = ri->next;
2178 	  for (rs = rsh; rs ; rs = rs->next)
2179 	    if (ri->rtype == rs->rtype && ri->srel == rs->srel)
2180 	      {
2181 		rs->count += ri->count;
2182 		goto found_reloc;
2183 	      }
2184 	  ri->next = hs->reloc_entries;
2185 	  hs->reloc_entries = ri;
2186 	found_reloc:;
2187 	}
2188     }
2189   hi->reloc_entries = NULL;
2190 }
2191 
2192 /* Is it possible to merge two object file's .got tables?  */
2193 
2194 static bool
2195 elf64_alpha_can_merge_gots (bfd *a, bfd *b)
2196 {
2197   int total = alpha_elf_tdata (a)->total_got_size;
2198   bfd *bsub;
2199 
2200   /* Trivial quick fallout test.  */
2201   if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2202     return true;
2203 
2204   /* By their nature, local .got entries cannot be merged.  */
2205   if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
2206     return false;
2207 
2208   /* Failing the common trivial comparison, we must effectively
2209      perform the merge.  Not actually performing the merge means that
2210      we don't have to store undo information in case we fail.  */
2211   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2212     {
2213       struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2214       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2215       int i, n;
2216 
2217       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2218       for (i = 0; i < n; ++i)
2219 	{
2220 	  struct alpha_elf_got_entry *ae, *be;
2221 	  struct alpha_elf_link_hash_entry *h;
2222 
2223 	  h = hashes[i];
2224 	  while (h->root.root.type == bfd_link_hash_indirect
2225 		 || h->root.root.type == bfd_link_hash_warning)
2226 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2227 
2228 	  for (be = h->got_entries; be ; be = be->next)
2229 	    {
2230 	      if (be->use_count == 0)
2231 		continue;
2232 	      if (be->gotobj != b)
2233 		continue;
2234 
2235 	      for (ae = h->got_entries; ae ; ae = ae->next)
2236 		if (ae->gotobj == a
2237 		    && ae->reloc_type == be->reloc_type
2238 		    && ae->addend == be->addend)
2239 		  goto global_found;
2240 
2241 	      total += alpha_got_entry_size (be->reloc_type);
2242 	      if (total > MAX_GOT_SIZE)
2243 		return false;
2244 	    global_found:;
2245 	    }
2246 	}
2247     }
2248 
2249   return true;
2250 }
2251 
2252 /* Actually merge two .got tables.  */
2253 
2254 static void
2255 elf64_alpha_merge_gots (bfd *a, bfd *b)
2256 {
2257   int total = alpha_elf_tdata (a)->total_got_size;
2258   bfd *bsub;
2259 
2260   /* Remember local expansion.  */
2261   {
2262     int e = alpha_elf_tdata (b)->local_got_size;
2263     total += e;
2264     alpha_elf_tdata (a)->local_got_size += e;
2265   }
2266 
2267   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2268     {
2269       struct alpha_elf_got_entry **local_got_entries;
2270       struct alpha_elf_link_hash_entry **hashes;
2271       Elf_Internal_Shdr *symtab_hdr;
2272       int i, n;
2273 
2274       /* Let the local .got entries know they are part of a new subsegment.  */
2275       local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2276       if (local_got_entries)
2277 	{
2278 	  n = elf_tdata (bsub)->symtab_hdr.sh_info;
2279 	  for (i = 0; i < n; ++i)
2280 	    {
2281 	      struct alpha_elf_got_entry *ent;
2282 	      for (ent = local_got_entries[i]; ent; ent = ent->next)
2283 		ent->gotobj = a;
2284 	    }
2285 	}
2286 
2287       /* Merge the global .got entries.  */
2288       hashes = alpha_elf_sym_hashes (bsub);
2289       symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2290 
2291       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2292       for (i = 0; i < n; ++i)
2293 	{
2294 	  struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2295 	  struct alpha_elf_link_hash_entry *h;
2296 
2297 	  h = hashes[i];
2298 	  while (h->root.root.type == bfd_link_hash_indirect
2299 		 || h->root.root.type == bfd_link_hash_warning)
2300 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2301 
2302 	  pbe = start = &h->got_entries;
2303 	  while ((be = *pbe) != NULL)
2304 	    {
2305 	      if (be->use_count == 0)
2306 		{
2307 		  *pbe = be->next;
2308 		  memset (be, 0xa5, sizeof (*be));
2309 		  goto kill;
2310 		}
2311 	      if (be->gotobj != b)
2312 		goto next;
2313 
2314 	      for (ae = *start; ae ; ae = ae->next)
2315 		if (ae->gotobj == a
2316 		    && ae->reloc_type == be->reloc_type
2317 		    && ae->addend == be->addend)
2318 		  {
2319 		    ae->flags |= be->flags;
2320 		    ae->use_count += be->use_count;
2321 		    *pbe = be->next;
2322 		    memset (be, 0xa5, sizeof (*be));
2323 		    goto kill;
2324 		  }
2325 	      be->gotobj = a;
2326 	      total += alpha_got_entry_size (be->reloc_type);
2327 
2328 	    next:;
2329 	      pbe = &be->next;
2330 	    kill:;
2331 	    }
2332 	}
2333 
2334       alpha_elf_tdata (bsub)->gotobj = a;
2335     }
2336   alpha_elf_tdata (a)->total_got_size = total;
2337 
2338   /* Merge the two in_got chains.  */
2339   {
2340     bfd *next;
2341 
2342     bsub = a;
2343     while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2344       bsub = next;
2345 
2346     alpha_elf_tdata (bsub)->in_got_link_next = b;
2347   }
2348 }
2349 
2350 /* Calculate the offsets for the got entries.  */
2351 
2352 static bool
2353 elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry *h,
2354 					 void * arg ATTRIBUTE_UNUSED)
2355 {
2356   struct alpha_elf_got_entry *gotent;
2357 
2358   for (gotent = h->got_entries; gotent; gotent = gotent->next)
2359     if (gotent->use_count > 0)
2360       {
2361 	struct alpha_elf_obj_tdata *td;
2362 	bfd_size_type *plge;
2363 
2364 	td = alpha_elf_tdata (gotent->gotobj);
2365 	plge = &td->got->size;
2366 	gotent->got_offset = *plge;
2367 	*plge += alpha_got_entry_size (gotent->reloc_type);
2368       }
2369 
2370   return true;
2371 }
2372 
2373 static void
2374 elf64_alpha_calc_got_offsets (struct bfd_link_info *info)
2375 {
2376   bfd *i, *got_list;
2377   struct alpha_elf_link_hash_table * htab;
2378 
2379   htab = alpha_elf_hash_table (info);
2380   if (htab == NULL)
2381     return;
2382   got_list = htab->got_list;
2383 
2384   /* First, zero out the .got sizes, as we may be recalculating the
2385      .got after optimizing it.  */
2386   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2387     alpha_elf_tdata(i)->got->size = 0;
2388 
2389   /* Next, fill in the offsets for all the global entries.  */
2390   alpha_elf_link_hash_traverse (htab,
2391 				elf64_alpha_calc_got_offsets_for_symbol,
2392 				NULL);
2393 
2394   /* Finally, fill in the offsets for the local entries.  */
2395   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2396     {
2397       bfd_size_type got_offset = alpha_elf_tdata(i)->got->size;
2398       bfd *j;
2399 
2400       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2401 	{
2402 	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2403 	  int k, n;
2404 
2405 	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2406 	  if (!local_got_entries)
2407 	    continue;
2408 
2409 	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2410 	    for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2411 	      if (gotent->use_count > 0)
2412 		{
2413 		  gotent->got_offset = got_offset;
2414 		  got_offset += alpha_got_entry_size (gotent->reloc_type);
2415 		}
2416 	}
2417 
2418       alpha_elf_tdata(i)->got->size = got_offset;
2419     }
2420 }
2421 
2422 /* Constructs the gots.  */
2423 
2424 static bool
2425 elf64_alpha_size_got_sections (struct bfd_link_info *info,
2426 			       bool may_merge)
2427 {
2428   bfd *i, *got_list, *cur_got_obj = NULL;
2429   struct alpha_elf_link_hash_table * htab;
2430 
2431   htab = alpha_elf_hash_table (info);
2432   if (htab == NULL)
2433     return false;
2434   got_list = htab->got_list;
2435 
2436   /* On the first time through, pretend we have an existing got list
2437      consisting of all of the input files.  */
2438   if (got_list == NULL)
2439     {
2440       for (i = info->input_bfds; i ; i = i->link.next)
2441 	{
2442 	  bfd *this_got;
2443 
2444 	  if (! is_alpha_elf (i))
2445 	    continue;
2446 
2447 	  this_got = alpha_elf_tdata (i)->gotobj;
2448 	  if (this_got == NULL)
2449 	    continue;
2450 
2451 	  /* We are assuming no merging has yet occurred.  */
2452 	  BFD_ASSERT (this_got == i);
2453 
2454 	  if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
2455 	    {
2456 	      /* Yikes! A single object file has too many entries.  */
2457 	      _bfd_error_handler
2458 		/* xgettext:c-format */
2459 		(_("%pB: .got subsegment exceeds 64K (size %d)"),
2460 		 i, alpha_elf_tdata (this_got)->total_got_size);
2461 	      return false;
2462 	    }
2463 
2464 	  if (got_list == NULL)
2465 	    got_list = this_got;
2466 	  else
2467 	    alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
2468 	  cur_got_obj = this_got;
2469 	}
2470 
2471       /* Strange degenerate case of no got references.  */
2472       if (got_list == NULL)
2473 	return true;
2474 
2475       htab->got_list = got_list;
2476     }
2477 
2478   cur_got_obj = got_list;
2479   if (cur_got_obj == NULL)
2480     return false;
2481 
2482   if (may_merge)
2483     {
2484       i = alpha_elf_tdata(cur_got_obj)->got_link_next;
2485       while (i != NULL)
2486 	{
2487 	  if (elf64_alpha_can_merge_gots (cur_got_obj, i))
2488 	    {
2489 	      elf64_alpha_merge_gots (cur_got_obj, i);
2490 
2491 	      alpha_elf_tdata(i)->got->size = 0;
2492 	      i = alpha_elf_tdata(i)->got_link_next;
2493 	      alpha_elf_tdata(cur_got_obj)->got_link_next = i;
2494 	    }
2495 	  else
2496 	    {
2497 	      cur_got_obj = i;
2498 	      i = alpha_elf_tdata(i)->got_link_next;
2499 	    }
2500 	}
2501     }
2502 
2503   /* Once the gots have been merged, fill in the got offsets for
2504      everything therein.  */
2505   elf64_alpha_calc_got_offsets (info);
2506 
2507   return true;
2508 }
2509 
2510 static bool
2511 elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry *h,
2512 				void * data)
2513 {
2514   asection *splt = (asection *) data;
2515   struct alpha_elf_got_entry *gotent;
2516   bool saw_one = false;
2517 
2518   /* If we didn't need an entry before, we still don't.  */
2519   if (!h->root.needs_plt)
2520     return true;
2521 
2522   /* For each LITERAL got entry still in use, allocate a plt entry.  */
2523   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2524     if (gotent->reloc_type == R_ALPHA_LITERAL
2525 	&& gotent->use_count > 0)
2526       {
2527 	if (splt->size == 0)
2528 	  splt->size = PLT_HEADER_SIZE;
2529 	gotent->plt_offset = splt->size;
2530 	splt->size += PLT_ENTRY_SIZE;
2531 	saw_one = true;
2532       }
2533 
2534   /* If there weren't any, there's no longer a need for the PLT entry.  */
2535   if (!saw_one)
2536     h->root.needs_plt = false;
2537 
2538   return true;
2539 }
2540 
2541 /* Called from relax_section to rebuild the PLT in light of potential changes
2542    in the function's status.  */
2543 
2544 static void
2545 elf64_alpha_size_plt_section (struct bfd_link_info *info)
2546 {
2547   asection *splt, *spltrel, *sgotplt;
2548   unsigned long entries;
2549   struct alpha_elf_link_hash_table * htab;
2550 
2551   htab = alpha_elf_hash_table (info);
2552   if (htab == NULL)
2553     return;
2554 
2555   splt = elf_hash_table(info)->splt;
2556   if (splt == NULL)
2557     return;
2558 
2559   splt->size = 0;
2560 
2561   alpha_elf_link_hash_traverse (htab,
2562 				elf64_alpha_size_plt_section_1, splt);
2563 
2564   /* Every plt entry requires a JMP_SLOT relocation.  */
2565   spltrel = elf_hash_table(info)->srelplt;
2566   entries = 0;
2567   if (splt->size)
2568     {
2569       if (elf64_alpha_use_secureplt)
2570 	entries = (splt->size - NEW_PLT_HEADER_SIZE) / NEW_PLT_ENTRY_SIZE;
2571       else
2572 	entries = (splt->size - OLD_PLT_HEADER_SIZE) / OLD_PLT_ENTRY_SIZE;
2573     }
2574   spltrel->size = entries * sizeof (Elf64_External_Rela);
2575 
2576   /* When using the secureplt, we need two words somewhere in the data
2577      segment for the dynamic linker to tell us where to go.  This is the
2578      entire contents of the .got.plt section.  */
2579   if (elf64_alpha_use_secureplt)
2580     {
2581       sgotplt = elf_hash_table(info)->sgotplt;
2582       sgotplt->size = entries ? 16 : 0;
2583     }
2584 }
2585 
2586 static bool
2587 elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2588 				  struct bfd_link_info *info)
2589 {
2590   bfd *i;
2591   struct alpha_elf_link_hash_table * htab;
2592 
2593   if (bfd_link_relocatable (info))
2594     return true;
2595 
2596   htab = alpha_elf_hash_table (info);
2597   if (htab == NULL)
2598     return false;
2599 
2600   if (!elf64_alpha_size_got_sections (info, true))
2601     return false;
2602 
2603   /* Allocate space for all of the .got subsections.  */
2604   i = htab->got_list;
2605   for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
2606     {
2607       asection *s = alpha_elf_tdata(i)->got;
2608       if (s->size > 0)
2609 	{
2610 	  s->contents = (bfd_byte *) bfd_zalloc (i, s->size);
2611 	  if (s->contents == NULL)
2612 	    return false;
2613 	}
2614     }
2615 
2616   return true;
2617 }
2618 
2619 /* The number of dynamic relocations required by a static relocation.  */
2620 
2621 static int
2622 alpha_dynamic_entries_for_reloc (int r_type, int dynamic, int shared, int pie)
2623 {
2624   switch (r_type)
2625     {
2626     /* May appear in GOT entries.  */
2627     case R_ALPHA_TLSGD:
2628       return (dynamic ? 2 : shared ? 1 : 0);
2629     case R_ALPHA_TLSLDM:
2630       return shared;
2631     case R_ALPHA_LITERAL:
2632       return dynamic || shared;
2633     case R_ALPHA_GOTTPREL:
2634       return dynamic || (shared && !pie);
2635     case R_ALPHA_GOTDTPREL:
2636       return dynamic;
2637 
2638     /* May appear in data sections.  */
2639     case R_ALPHA_REFLONG:
2640     case R_ALPHA_REFQUAD:
2641       return dynamic || shared;
2642     case R_ALPHA_TPREL64:
2643       return dynamic || (shared && !pie);
2644 
2645     /* Everything else is illegal.  We'll issue an error during
2646        relocate_section.  */
2647     default:
2648       return 0;
2649     }
2650 }
2651 
2652 /* Work out the sizes of the dynamic relocation entries.  */
2653 
2654 static bool
2655 elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
2656 			       struct bfd_link_info *info)
2657 {
2658   bool dynamic;
2659   struct alpha_elf_reloc_entry *relent;
2660   unsigned long entries;
2661 
2662   /* If the symbol was defined as a common symbol in a regular object
2663      file, and there was no definition in any dynamic object, then the
2664      linker will have allocated space for the symbol in a common
2665      section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2666      set.  This is done for dynamic symbols in
2667      elf_adjust_dynamic_symbol but this is not done for non-dynamic
2668      symbols, somehow.  */
2669   if (!h->root.def_regular
2670       && h->root.ref_regular
2671       && !h->root.def_dynamic
2672       && (h->root.root.type == bfd_link_hash_defined
2673 	  || h->root.root.type == bfd_link_hash_defweak)
2674       && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
2675     h->root.def_regular = 1;
2676 
2677   /* If the symbol is dynamic, we'll need all the relocations in their
2678      natural form.  If this is a shared object, and it has been forced
2679      local, we'll need the same number of RELATIVE relocations.  */
2680   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2681 
2682   /* If the symbol is a hidden undefined weak, then we never have any
2683      relocations.  Avoid the loop which may want to add RELATIVE relocs
2684      based on bfd_link_pic (info).  */
2685   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2686     return true;
2687 
2688   for (relent = h->reloc_entries; relent; relent = relent->next)
2689     {
2690       entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
2691 						 bfd_link_pic (info),
2692 						 bfd_link_pie (info));
2693       if (entries)
2694 	{
2695 	  asection *sec = relent->sec;
2696 	  relent->srel->size +=
2697 	    entries * sizeof (Elf64_External_Rela) * relent->count;
2698 	  if ((sec->flags & SEC_READONLY) != 0)
2699 	    {
2700 	      info->flags |= DT_TEXTREL;
2701 	      info->callbacks->minfo
2702 		(_("%pB: dynamic relocation against `%pT' in "
2703 		   "read-only section `%pA'\n"),
2704 		 sec->owner, h->root.root.root.string, sec);
2705 	    }
2706 	}
2707     }
2708 
2709   return true;
2710 }
2711 
2712 /* Subroutine of elf64_alpha_size_rela_got_section for doing the
2713    global symbols.  */
2714 
2715 static bool
2716 elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry *h,
2717 			     struct bfd_link_info *info)
2718 {
2719   bool dynamic;
2720   struct alpha_elf_got_entry *gotent;
2721   unsigned long entries;
2722 
2723   /* If we're using a plt for this symbol, then all of its relocations
2724      for its got entries go into .rela.plt.  */
2725   if (h->root.needs_plt)
2726     return true;
2727 
2728   /* If the symbol is dynamic, we'll need all the relocations in their
2729      natural form.  If this is a shared object, and it has been forced
2730      local, we'll need the same number of RELATIVE relocations.  */
2731   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2732 
2733   /* If the symbol is a hidden undefined weak, then we never have any
2734      relocations.  Avoid the loop which may want to add RELATIVE relocs
2735      based on bfd_link_pic (info).  */
2736   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2737     return true;
2738 
2739   entries = 0;
2740   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2741     if (gotent->use_count > 0)
2742       entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type, dynamic,
2743 						  bfd_link_pic (info),
2744 						  bfd_link_pie (info));
2745 
2746   if (entries > 0)
2747     {
2748       asection *srel = elf_hash_table(info)->srelgot;
2749       BFD_ASSERT (srel != NULL);
2750       srel->size += sizeof (Elf64_External_Rela) * entries;
2751     }
2752 
2753   return true;
2754 }
2755 
2756 /* Set the sizes of the dynamic relocation sections.  */
2757 
2758 static void
2759 elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
2760 {
2761   unsigned long entries;
2762   bfd *i;
2763   asection *srel;
2764   struct alpha_elf_link_hash_table * htab;
2765 
2766   htab = alpha_elf_hash_table (info);
2767   if (htab == NULL)
2768     return;
2769 
2770   /* Shared libraries often require RELATIVE relocs, and some relocs
2771      require attention for the main application as well.  */
2772 
2773   entries = 0;
2774   for (i = htab->got_list;
2775        i ; i = alpha_elf_tdata(i)->got_link_next)
2776     {
2777       bfd *j;
2778 
2779       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2780 	{
2781 	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2782 	  int k, n;
2783 
2784 	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2785 	  if (!local_got_entries)
2786 	    continue;
2787 
2788 	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2789 	    for (gotent = local_got_entries[k];
2790 		 gotent ; gotent = gotent->next)
2791 	      if (gotent->use_count > 0)
2792 		entries += (alpha_dynamic_entries_for_reloc
2793 			    (gotent->reloc_type, 0, bfd_link_pic (info),
2794 			     bfd_link_pie (info)));
2795 	}
2796     }
2797 
2798   srel = elf_hash_table(info)->srelgot;
2799   if (!srel)
2800     {
2801       BFD_ASSERT (entries == 0);
2802       return;
2803     }
2804   srel->size = sizeof (Elf64_External_Rela) * entries;
2805 
2806   /* Now do the non-local symbols.  */
2807   alpha_elf_link_hash_traverse (htab,
2808 				elf64_alpha_size_rela_got_1, info);
2809 }
2810 
2811 /* Set the sizes of the dynamic sections.  */
2812 
2813 static bool
2814 elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2815 				   struct bfd_link_info *info)
2816 {
2817   bfd *dynobj;
2818   asection *s;
2819   bool relplt, relocs;
2820   struct alpha_elf_link_hash_table * htab;
2821 
2822   htab = alpha_elf_hash_table (info);
2823   if (htab == NULL)
2824     return false;
2825 
2826   dynobj = elf_hash_table(info)->dynobj;
2827   BFD_ASSERT(dynobj != NULL);
2828 
2829   if (elf_hash_table (info)->dynamic_sections_created)
2830     {
2831       /* Set the contents of the .interp section to the interpreter.  */
2832       if (bfd_link_executable (info) && !info->nointerp)
2833 	{
2834 	  s = bfd_get_linker_section (dynobj, ".interp");
2835 	  BFD_ASSERT (s != NULL);
2836 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2837 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2838 	}
2839 
2840       /* Now that we've seen all of the input files, we can decide which
2841 	 symbols need dynamic relocation entries and which don't.  We've
2842 	 collected information in check_relocs that we can now apply to
2843 	 size the dynamic relocation sections.  */
2844       alpha_elf_link_hash_traverse (htab,
2845 				    elf64_alpha_calc_dynrel_sizes, info);
2846 
2847       elf64_alpha_size_rela_got_section (info);
2848       elf64_alpha_size_plt_section (info);
2849     }
2850   /* else we're not dynamic and by definition we don't need such things.  */
2851 
2852   /* The check_relocs and adjust_dynamic_symbol entry points have
2853      determined the sizes of the various dynamic sections.  Allocate
2854      memory for them.  */
2855   relplt = false;
2856   relocs = false;
2857   for (s = dynobj->sections; s != NULL; s = s->next)
2858     {
2859       const char *name;
2860 
2861       if (!(s->flags & SEC_LINKER_CREATED))
2862 	continue;
2863 
2864       /* It's OK to base decisions on the section name, because none
2865 	 of the dynobj section names depend upon the input files.  */
2866       name = bfd_section_name (s);
2867 
2868       if (startswith (name, ".rela"))
2869 	{
2870 	  if (s->size != 0)
2871 	    {
2872 	      if (strcmp (name, ".rela.plt") == 0)
2873 		relplt = true;
2874 	      else
2875 		relocs = true;
2876 
2877 	      /* We use the reloc_count field as a counter if we need
2878 		 to copy relocs into the output file.  */
2879 	      s->reloc_count = 0;
2880 	    }
2881 	}
2882       else if (! startswith (name, ".got")
2883 	       && strcmp (name, ".plt") != 0
2884 	       && strcmp (name, ".dynbss") != 0)
2885 	{
2886 	  /* It's not one of our dynamic sections, so don't allocate space.  */
2887 	  continue;
2888 	}
2889 
2890       if (s->size == 0)
2891 	{
2892 	  /* If we don't need this section, strip it from the output file.
2893 	     This is to handle .rela.bss and .rela.plt.  We must create it
2894 	     in create_dynamic_sections, because it must be created before
2895 	     the linker maps input sections to output sections.  The
2896 	     linker does that before adjust_dynamic_symbol is called, and
2897 	     it is that function which decides whether anything needs to
2898 	     go into these sections.  */
2899 	  if (!startswith (name, ".got"))
2900 	    s->flags |= SEC_EXCLUDE;
2901 	}
2902       else if ((s->flags & SEC_HAS_CONTENTS) != 0)
2903 	{
2904 	  /* Allocate memory for the section contents.  */
2905 	  s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2906 	  if (s->contents == NULL)
2907 	    return false;
2908 	}
2909     }
2910 
2911   if (elf_hash_table (info)->dynamic_sections_created)
2912     {
2913       /* Add some entries to the .dynamic section.  We fill in the
2914 	 values later, in elf64_alpha_finish_dynamic_sections, but we
2915 	 must add the entries now so that we get the correct size for
2916 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2917 	 dynamic linker and used by the debugger.  */
2918 #define add_dynamic_entry(TAG, VAL) \
2919   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2920 
2921       if (!_bfd_elf_add_dynamic_tags (output_bfd, info,
2922 				      relocs || relplt))
2923 	return false;
2924 
2925       if (relplt
2926 	  && elf64_alpha_use_secureplt
2927 	  && !add_dynamic_entry (DT_ALPHA_PLTRO, 1))
2928 	return false;
2929     }
2930 #undef add_dynamic_entry
2931 
2932   return true;
2933 }
2934 
2935 /* These functions do relaxation for Alpha ELF.
2936 
2937    Currently I'm only handling what I can do with existing compiler
2938    and assembler support, which means no instructions are removed,
2939    though some may be nopped.  At this time GCC does not emit enough
2940    information to do all of the relaxing that is possible.  It will
2941    take some not small amount of work for that to happen.
2942 
2943    There are a couple of interesting papers that I once read on this
2944    subject, that I cannot find references to at the moment, that
2945    related to Alpha in particular.  They are by David Wall, then of
2946    DEC WRL.  */
2947 
2948 struct alpha_relax_info
2949 {
2950   bfd *abfd;
2951   asection *sec;
2952   bfd_byte *contents;
2953   Elf_Internal_Shdr *symtab_hdr;
2954   Elf_Internal_Rela *relocs, *relend;
2955   struct bfd_link_info *link_info;
2956   bfd_vma gp;
2957   bfd *gotobj;
2958   asection *tsec;
2959   struct alpha_elf_link_hash_entry *h;
2960   struct alpha_elf_got_entry **first_gotent;
2961   struct alpha_elf_got_entry *gotent;
2962   bool changed_contents;
2963   bool changed_relocs;
2964   unsigned char other;
2965 };
2966 
2967 static Elf_Internal_Rela *
2968 elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela *rel,
2969 			       Elf_Internal_Rela *relend,
2970 			       bfd_vma offset, int type)
2971 {
2972   while (rel < relend)
2973     {
2974       if (rel->r_offset == offset
2975 	  && ELF64_R_TYPE (rel->r_info) == (unsigned int) type)
2976 	return rel;
2977       ++rel;
2978     }
2979   return NULL;
2980 }
2981 
2982 static bool
2983 elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
2984 			    Elf_Internal_Rela *irel, unsigned long r_type)
2985 {
2986   unsigned int insn;
2987   bfd_signed_vma disp;
2988 
2989   /* Get the instruction.  */
2990   insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
2991 
2992   if (insn >> 26 != OP_LDQ)
2993     {
2994       reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
2995       _bfd_error_handler
2996 	/* xgettext:c-format */
2997 	(_("%pB: %pA+%#" PRIx64 ": warning: "
2998 	   "%s relocation against unexpected insn"),
2999 	 info->abfd, info->sec, (uint64_t) irel->r_offset, howto->name);
3000       return true;
3001     }
3002 
3003   /* Can't relax dynamic symbols.  */
3004   if (info->h != NULL
3005       && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3006     return true;
3007 
3008   /* Can't use local-exec relocations in shared libraries.  */
3009   if (r_type == R_ALPHA_GOTTPREL
3010       && bfd_link_dll (info->link_info))
3011     return true;
3012 
3013   if (r_type == R_ALPHA_LITERAL)
3014     {
3015       /* Look for nice constant addresses.  This includes the not-uncommon
3016 	 special case of 0 for undefweak symbols.  */
3017       if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3018 	  || (!bfd_link_pic (info->link_info)
3019 	      && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3020 	{
3021 	  disp = 0;
3022 	  insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3023 	  insn |= (symval & 0xffff);
3024 	  r_type = R_ALPHA_NONE;
3025 	}
3026       else
3027 	{
3028 	  /* We may only create GPREL relocs during the second pass.  */
3029 	  if (info->link_info->relax_pass == 0)
3030 	    return true;
3031 
3032 	  disp = symval - info->gp;
3033 	  insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3034 	  r_type = R_ALPHA_GPREL16;
3035 	}
3036     }
3037   else
3038     {
3039       bfd_vma dtp_base, tp_base;
3040 
3041       BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3042       dtp_base = alpha_get_dtprel_base (info->link_info);
3043       tp_base = alpha_get_tprel_base (info->link_info);
3044       disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3045 
3046       insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3047 
3048       switch (r_type)
3049 	{
3050 	case R_ALPHA_GOTDTPREL:
3051 	  r_type = R_ALPHA_DTPREL16;
3052 	  break;
3053 	case R_ALPHA_GOTTPREL:
3054 	  r_type = R_ALPHA_TPREL16;
3055 	  break;
3056 	default:
3057 	  BFD_ASSERT (0);
3058 	  return false;
3059 	}
3060     }
3061 
3062   if (disp < -0x8000 || disp >= 0x8000)
3063     return true;
3064 
3065   bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3066   info->changed_contents = true;
3067 
3068   /* Reduce the use count on this got entry by one, possibly
3069      eliminating it.  */
3070   if (--info->gotent->use_count == 0)
3071     {
3072       int sz = alpha_got_entry_size (r_type);
3073       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3074       if (!info->h)
3075 	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3076     }
3077 
3078   /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3079   irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3080   info->changed_relocs = true;
3081 
3082   /* ??? Search forward through this basic block looking for insns
3083      that use the target register.  Stop after an insn modifying the
3084      register is seen, or after a branch or call.
3085 
3086      Any such memory load insn may be substituted by a load directly
3087      off the GP.  This allows the memory load insn to be issued before
3088      the calculated GP register would otherwise be ready.
3089 
3090      Any such jsr insn can be replaced by a bsr if it is in range.
3091 
3092      This would mean that we'd have to _add_ relocations, the pain of
3093      which gives one pause.  */
3094 
3095   return true;
3096 }
3097 
3098 static bfd_vma
3099 elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3100 {
3101   /* If the function has the same gp, and we can identify that the
3102      function does not use its function pointer, we can eliminate the
3103      address load.  */
3104 
3105   /* If the symbol is marked NOPV, we are being told the function never
3106      needs its procedure value.  */
3107   if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3108     return symval;
3109 
3110   /* If the symbol is marked STD_GP, we are being told the function does
3111      a normal ldgp in the first two words.  */
3112   else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3113     ;
3114 
3115   /* Otherwise, we may be able to identify a GP load in the first two
3116      words, which we can then skip.  */
3117   else
3118     {
3119       Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3120       bfd_vma ofs;
3121 
3122       /* Load the relocations from the section that the target symbol is in.  */
3123       if (info->sec == info->tsec)
3124 	{
3125 	  tsec_relocs = info->relocs;
3126 	  tsec_relend = info->relend;
3127 	  tsec_free = NULL;
3128 	}
3129       else
3130 	{
3131 	  tsec_relocs = (_bfd_elf_link_read_relocs
3132 			 (info->abfd, info->tsec, NULL,
3133 			 (Elf_Internal_Rela *) NULL,
3134 			 info->link_info->keep_memory));
3135 	  if (tsec_relocs == NULL)
3136 	    return 0;
3137 	  tsec_relend = tsec_relocs + info->tsec->reloc_count;
3138 	  tsec_free = (elf_section_data (info->tsec)->relocs == tsec_relocs
3139 		       ? NULL
3140 		       : tsec_relocs);
3141 	}
3142 
3143       /* Recover the symbol's offset within the section.  */
3144       ofs = (symval - info->tsec->output_section->vma
3145 	     - info->tsec->output_offset);
3146 
3147       /* Look for a GPDISP reloc.  */
3148       gpdisp = (elf64_alpha_find_reloc_at_ofs
3149 		(tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3150 
3151       if (!gpdisp || gpdisp->r_addend != 4)
3152 	{
3153 	  free (tsec_free);
3154 	  return 0;
3155 	}
3156       free (tsec_free);
3157     }
3158 
3159   /* We've now determined that we can skip an initial gp load.  Verify
3160      that the call and the target use the same gp.   */
3161   if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3162       || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3163     return 0;
3164 
3165   return symval + 8;
3166 }
3167 
3168 static bool
3169 elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3170 			       bfd_vma symval, Elf_Internal_Rela *irel)
3171 {
3172   Elf_Internal_Rela *urel, *erel, *irelend = info->relend;
3173   int flags;
3174   bfd_signed_vma disp;
3175   bool fits16;
3176   bool fits32;
3177   bool lit_reused = false;
3178   bool all_optimized = true;
3179   bool changed_contents;
3180   bool changed_relocs;
3181   bfd_byte *contents = info->contents;
3182   bfd *abfd = info->abfd;
3183   bfd_vma sec_output_vma;
3184   unsigned int lit_insn;
3185   int relax_pass;
3186 
3187   lit_insn = bfd_get_32 (abfd, contents + irel->r_offset);
3188   if (lit_insn >> 26 != OP_LDQ)
3189     {
3190       _bfd_error_handler
3191 	/* xgettext:c-format */
3192 	(_("%pB: %pA+%#" PRIx64 ": warning: "
3193 	   "%s relocation against unexpected insn"),
3194 	 abfd, info->sec, (uint64_t) irel->r_offset, "LITERAL");
3195       return true;
3196     }
3197 
3198   /* Can't relax dynamic symbols.  */
3199   if (info->h != NULL
3200       && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3201     return true;
3202 
3203   changed_contents = info->changed_contents;
3204   changed_relocs = info->changed_relocs;
3205   sec_output_vma = info->sec->output_section->vma + info->sec->output_offset;
3206   relax_pass = info->link_info->relax_pass;
3207 
3208   /* Summarize how this particular LITERAL is used.  */
3209   for (erel = irel+1, flags = 0; erel < irelend; ++erel)
3210     {
3211       if (ELF64_R_TYPE (erel->r_info) != R_ALPHA_LITUSE)
3212 	break;
3213       if (erel->r_addend <= 6)
3214 	flags |= 1 << erel->r_addend;
3215     }
3216 
3217   /* A little preparation for the loop...  */
3218   disp = symval - info->gp;
3219 
3220   for (urel = irel+1; urel < erel; ++urel)
3221     {
3222       bfd_vma urel_r_offset = urel->r_offset;
3223       unsigned int insn;
3224       int insn_disp;
3225       bfd_signed_vma xdisp;
3226       Elf_Internal_Rela nrel;
3227 
3228       insn = bfd_get_32 (abfd, contents + urel_r_offset);
3229 
3230       switch (urel->r_addend)
3231 	{
3232 	case LITUSE_ALPHA_ADDR:
3233 	default:
3234 	  /* This type is really just a placeholder to note that all
3235 	     uses cannot be optimized, but to still allow some.  */
3236 	  all_optimized = false;
3237 	  break;
3238 
3239 	case LITUSE_ALPHA_BASE:
3240 	  /* We may only create GPREL relocs during the second pass.  */
3241 	  if (relax_pass == 0)
3242 	    {
3243 	      all_optimized = false;
3244 	      break;
3245 	    }
3246 
3247 	  /* We can always optimize 16-bit displacements.  */
3248 
3249 	  /* Extract the displacement from the instruction, sign-extending
3250 	     it if necessary, then test whether it is within 16 or 32 bits
3251 	     displacement from GP.  */
3252 	  insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3253 
3254 	  xdisp = disp + insn_disp;
3255 	  fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3256 	  fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3257 		    && xdisp < 0x7fff8000);
3258 
3259 	  if (fits16)
3260 	    {
3261 	      /* Take the op code and dest from this insn, take the base
3262 		 register from the literal insn.  Leave the offset alone.  */
3263 	      insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3264 	      bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3265 	      changed_contents = true;
3266 
3267 	      nrel = *urel;
3268 	      nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3269 					  R_ALPHA_GPREL16);
3270 	      nrel.r_addend = irel->r_addend;
3271 
3272 	      /* As we adjust, move the reloc to the end so that we don't
3273 		 break the LITERAL+LITUSE chain.  */
3274 	      if (urel < --erel)
3275 		*urel-- = *erel;
3276 	      *erel = nrel;
3277 	      changed_relocs = true;
3278 	    }
3279 
3280 	  /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3281 	  else if (fits32 && !(flags & ~6))
3282 	    {
3283 	      /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3284 
3285 	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3286 					   R_ALPHA_GPRELHIGH);
3287 	      lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3288 	      bfd_put_32 (abfd, (bfd_vma) lit_insn, contents + irel->r_offset);
3289 	      lit_reused = true;
3290 	      changed_contents = true;
3291 
3292 	      /* Since all relocs must be optimized, don't bother swapping
3293 		 this relocation to the end.  */
3294 	      urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3295 					   R_ALPHA_GPRELLOW);
3296 	      urel->r_addend = irel->r_addend;
3297 	      changed_relocs = true;
3298 	    }
3299 	  else
3300 	    all_optimized = false;
3301 	  break;
3302 
3303 	case LITUSE_ALPHA_BYTOFF:
3304 	  /* We can always optimize byte instructions.  */
3305 
3306 	  /* FIXME: sanity check the insn for byte op.  Check that the
3307 	     literal dest reg is indeed Rb in the byte insn.  */
3308 
3309 	  insn &= ~ (unsigned) 0x001ff000;
3310 	  insn |= ((symval & 7) << 13) | 0x1000;
3311 	  bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3312 	  changed_contents = true;
3313 
3314 	  nrel = *urel;
3315 	  nrel.r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3316 	  nrel.r_addend = 0;
3317 
3318 	  /* As we adjust, move the reloc to the end so that we don't
3319 	     break the LITERAL+LITUSE chain.  */
3320 	  if (urel < --erel)
3321 	    *urel-- = *erel;
3322 	  *erel = nrel;
3323 	  changed_relocs = true;
3324 	  break;
3325 
3326 	case LITUSE_ALPHA_JSR:
3327 	case LITUSE_ALPHA_TLSGD:
3328 	case LITUSE_ALPHA_TLSLDM:
3329 	case LITUSE_ALPHA_JSRDIRECT:
3330 	  {
3331 	    bfd_vma optdest, org;
3332 	    bfd_signed_vma odisp;
3333 
3334 	    /* For undefined weak symbols, we're mostly interested in getting
3335 	       rid of the got entry whenever possible, so optimize this to a
3336 	       use of the zero register.  */
3337 	    if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3338 	      {
3339 		insn |= 31 << 16;
3340 		bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3341 
3342 		changed_contents = true;
3343 		break;
3344 	      }
3345 
3346 	    /* If not zero, place to jump without needing pv.  */
3347 	    optdest = elf64_alpha_relax_opt_call (info, symval);
3348 	    org = sec_output_vma + urel_r_offset + 4;
3349 	    odisp = (optdest ? optdest : symval) - org;
3350 
3351 	    if (odisp >= -0x400000 && odisp < 0x400000)
3352 	      {
3353 		Elf_Internal_Rela *xrel;
3354 
3355 		/* Preserve branch prediction call stack when possible.  */
3356 		if ((insn & INSN_JSR_MASK) == INSN_JSR)
3357 		  insn = (OP_BSR << 26) | (insn & 0x03e00000);
3358 		else
3359 		  insn = (OP_BR << 26) | (insn & 0x03e00000);
3360 		bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3361 		changed_contents = true;
3362 
3363 		nrel = *urel;
3364 		nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3365 					    R_ALPHA_BRADDR);
3366 		nrel.r_addend = irel->r_addend;
3367 
3368 		if (optdest)
3369 		  nrel.r_addend += optdest - symval;
3370 		else
3371 		  all_optimized = false;
3372 
3373 		/* Kill any HINT reloc that might exist for this insn.  */
3374 		xrel = (elf64_alpha_find_reloc_at_ofs
3375 			(info->relocs, info->relend, urel_r_offset,
3376 			 R_ALPHA_HINT));
3377 		if (xrel)
3378 		  xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3379 
3380 		/* As we adjust, move the reloc to the end so that we don't
3381 		   break the LITERAL+LITUSE chain.  */
3382 		if (urel < --erel)
3383 		  *urel-- = *erel;
3384 		*erel = nrel;
3385 
3386 		info->changed_relocs = true;
3387 	      }
3388 	    else
3389 	      all_optimized = false;
3390 
3391 	    /* Even if the target is not in range for a direct branch,
3392 	       if we share a GP, we can eliminate the gp reload.  */
3393 	    if (optdest)
3394 	      {
3395 		Elf_Internal_Rela *gpdisp
3396 		  = (elf64_alpha_find_reloc_at_ofs
3397 		     (info->relocs, irelend, urel_r_offset + 4,
3398 		      R_ALPHA_GPDISP));
3399 		if (gpdisp)
3400 		  {
3401 		    bfd_byte *p_ldah = contents + gpdisp->r_offset;
3402 		    bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3403 		    unsigned int ldah = bfd_get_32 (abfd, p_ldah);
3404 		    unsigned int lda = bfd_get_32 (abfd, p_lda);
3405 
3406 		    /* Verify that the instruction is "ldah $29,0($26)".
3407 		       Consider a function that ends in a noreturn call,
3408 		       and that the next function begins with an ldgp,
3409 		       and that by accident there is no padding between.
3410 		       In that case the insn would use $27 as the base.  */
3411 		    if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3412 		      {
3413 			bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_ldah);
3414 			bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_lda);
3415 
3416 			gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3417 			changed_contents = true;
3418 			changed_relocs = true;
3419 		      }
3420 		  }
3421 	      }
3422 	  }
3423 	  break;
3424 	}
3425     }
3426 
3427   /* If we reused the literal instruction, we must have optimized all.  */
3428   BFD_ASSERT(!lit_reused || all_optimized);
3429 
3430   /* If all cases were optimized, we can reduce the use count on this
3431      got entry by one, possibly eliminating it.  */
3432   if (all_optimized)
3433     {
3434       if (--info->gotent->use_count == 0)
3435 	{
3436 	  int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3437 	  alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3438 	  if (!info->h)
3439 	    alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3440 	}
3441 
3442       /* If the literal instruction is no longer needed (it may have been
3443 	 reused.  We can eliminate it.  */
3444       /* ??? For now, I don't want to deal with compacting the section,
3445 	 so just nop it out.  */
3446       if (!lit_reused)
3447 	{
3448 	  irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3449 	  changed_relocs = true;
3450 
3451 	  bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, contents + irel->r_offset);
3452 	  changed_contents = true;
3453 	}
3454     }
3455 
3456   info->changed_contents = changed_contents;
3457   info->changed_relocs = changed_relocs;
3458 
3459   if (all_optimized || relax_pass == 0)
3460     return true;
3461   return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3462 }
3463 
3464 static bool
3465 elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3466 				Elf_Internal_Rela *irel, bool is_gd)
3467 {
3468   bfd_byte *pos[5];
3469   unsigned int insn, tlsgd_reg;
3470   Elf_Internal_Rela *gpdisp, *hint;
3471   bool dynamic, use_gottprel;
3472   unsigned long new_symndx;
3473 
3474   dynamic = (info->h != NULL
3475 	     && alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info));
3476 
3477   /* If a TLS symbol is accessed using IE at least once, there is no point
3478      to use dynamic model for it.  */
3479   if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3480     ;
3481 
3482   /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3483      then we might as well relax to IE.  */
3484   else if (bfd_link_pic (info->link_info) && !dynamic
3485 	   && (info->link_info->flags & DF_STATIC_TLS))
3486     ;
3487 
3488   /* Otherwise we must be building an executable to do anything.  */
3489   else if (bfd_link_pic (info->link_info))
3490     return true;
3491 
3492   /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3493      the matching LITUSE_TLS relocations.  */
3494   if (irel + 2 >= info->relend)
3495     return true;
3496   if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3497       || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3498       || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3499     return true;
3500 
3501   /* There must be a GPDISP relocation positioned immediately after the
3502      LITUSE relocation.  */
3503   gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3504 					  irel[2].r_offset + 4, R_ALPHA_GPDISP);
3505   if (!gpdisp)
3506     return true;
3507 
3508   pos[0] = info->contents + irel[0].r_offset;
3509   pos[1] = info->contents + irel[1].r_offset;
3510   pos[2] = info->contents + irel[2].r_offset;
3511   pos[3] = info->contents + gpdisp->r_offset;
3512   pos[4] = pos[3] + gpdisp->r_addend;
3513 
3514   /* Beware of the compiler hoisting part of the sequence out a loop
3515      and adjusting the destination register for the TLSGD insn.  If this
3516      happens, there will be a move into $16 before the JSR insn, so only
3517      transformations of the first insn pair should use this register.  */
3518   tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3519   tlsgd_reg = (tlsgd_reg >> 21) & 31;
3520 
3521   /* Generally, the positions are not allowed to be out of order, lest the
3522      modified insn sequence have different register lifetimes.  We can make
3523      an exception when pos 1 is adjacent to pos 0.  */
3524   if (pos[1] + 4 == pos[0])
3525     {
3526       bfd_byte *tmp = pos[0];
3527       pos[0] = pos[1];
3528       pos[1] = tmp;
3529     }
3530   if (pos[1] >= pos[2] || pos[2] >= pos[3])
3531     return true;
3532 
3533   /* Reduce the use count on the LITERAL relocation.  Do this before we
3534      smash the symndx when we adjust the relocations below.  */
3535   {
3536     struct alpha_elf_got_entry *lit_gotent;
3537     struct alpha_elf_link_hash_entry *lit_h;
3538     unsigned long indx;
3539 
3540     BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3541     indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3542     lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3543 
3544     while (lit_h->root.root.type == bfd_link_hash_indirect
3545 	   || lit_h->root.root.type == bfd_link_hash_warning)
3546       lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3547 
3548     for (lit_gotent = lit_h->got_entries; lit_gotent ;
3549 	 lit_gotent = lit_gotent->next)
3550       if (lit_gotent->gotobj == info->gotobj
3551 	  && lit_gotent->reloc_type == R_ALPHA_LITERAL
3552 	  && lit_gotent->addend == irel[1].r_addend)
3553 	break;
3554     BFD_ASSERT (lit_gotent);
3555 
3556     if (--lit_gotent->use_count == 0)
3557       {
3558 	int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3559 	alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3560       }
3561   }
3562 
3563   /* Change
3564 
3565 	lda	$16,x($gp)			!tlsgd!1
3566 	ldq	$27,__tls_get_addr($gp)		!literal!1
3567 	jsr	$26,($27),__tls_get_addr	!lituse_tlsgd!1
3568 	ldah	$29,0($26)			!gpdisp!2
3569 	lda	$29,0($29)			!gpdisp!2
3570      to
3571 	ldq	$16,x($gp)			!gottprel
3572 	unop
3573 	call_pal rduniq
3574 	addq	$16,$0,$0
3575 	unop
3576      or the first pair to
3577 	lda	$16,x($gp)			!tprel
3578 	unop
3579      or
3580 	ldah	$16,x($gp)			!tprelhi
3581 	lda	$16,x($16)			!tprello
3582 
3583      as appropriate.  */
3584 
3585   use_gottprel = false;
3586   new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3587 
3588   /* Some compilers warn about a Boolean-looking expression being
3589      used in a switch.  The explicit cast silences them.  */
3590   switch ((int) (!dynamic && !bfd_link_pic (info->link_info)))
3591     {
3592     case 1:
3593       {
3594 	bfd_vma tp_base;
3595 	bfd_signed_vma disp;
3596 
3597 	BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3598 	tp_base = alpha_get_tprel_base (info->link_info);
3599 	disp = symval - tp_base;
3600 
3601 	if (disp >= -0x8000 && disp < 0x8000)
3602 	  {
3603 	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3604 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3605 	    bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3606 
3607 	    irel[0].r_offset = pos[0] - info->contents;
3608 	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3609 	    irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3610 	    break;
3611 	  }
3612 	else if (disp >= -(bfd_signed_vma) 0x80000000
3613 		 && disp < (bfd_signed_vma) 0x7fff8000
3614 		 && pos[0] + 4 == pos[1])
3615 	  {
3616 	    insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3617 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3618 	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3619 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3620 
3621 	    irel[0].r_offset = pos[0] - info->contents;
3622 	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3623 	    irel[1].r_offset = pos[1] - info->contents;
3624 	    irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3625 	    break;
3626 	  }
3627       }
3628       /* FALLTHRU */
3629 
3630     default:
3631       use_gottprel = true;
3632 
3633       insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3634       bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3635       bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3636 
3637       irel[0].r_offset = pos[0] - info->contents;
3638       irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3639       irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3640       break;
3641     }
3642 
3643   bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3644 
3645   insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3646   bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3647 
3648   bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3649 
3650   irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3651   gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3652 
3653   hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3654 					irel[2].r_offset, R_ALPHA_HINT);
3655   if (hint)
3656     hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3657 
3658   info->changed_contents = true;
3659   info->changed_relocs = true;
3660 
3661   /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3662   if (--info->gotent->use_count == 0)
3663     {
3664       int sz = alpha_got_entry_size (info->gotent->reloc_type);
3665       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3666       if (!info->h)
3667 	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3668     }
3669 
3670   /* If we've switched to a GOTTPREL relocation, increment the reference
3671      count on that got entry.  */
3672   if (use_gottprel)
3673     {
3674       struct alpha_elf_got_entry *tprel_gotent;
3675 
3676       for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3677 	   tprel_gotent = tprel_gotent->next)
3678 	if (tprel_gotent->gotobj == info->gotobj
3679 	    && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3680 	    && tprel_gotent->addend == irel->r_addend)
3681 	  break;
3682       if (tprel_gotent)
3683 	tprel_gotent->use_count++;
3684       else
3685 	{
3686 	  if (info->gotent->use_count == 0)
3687 	    tprel_gotent = info->gotent;
3688 	  else
3689 	    {
3690 	      tprel_gotent = (struct alpha_elf_got_entry *)
3691 		bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3692 	      if (!tprel_gotent)
3693 		return false;
3694 
3695 	      tprel_gotent->next = *info->first_gotent;
3696 	      *info->first_gotent = tprel_gotent;
3697 
3698 	      tprel_gotent->gotobj = info->gotobj;
3699 	      tprel_gotent->addend = irel->r_addend;
3700 	      tprel_gotent->got_offset = -1;
3701 	      tprel_gotent->reloc_done = 0;
3702 	      tprel_gotent->reloc_xlated = 0;
3703 	    }
3704 
3705 	  tprel_gotent->use_count = 1;
3706 	  tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3707 	}
3708     }
3709 
3710   return true;
3711 }
3712 
3713 static bool
3714 elf64_alpha_relax_section (bfd *abfd, asection *sec,
3715 			   struct bfd_link_info *link_info, bool *again)
3716 {
3717   Elf_Internal_Shdr *symtab_hdr;
3718   Elf_Internal_Rela *internal_relocs;
3719   Elf_Internal_Rela *irel, *irelend;
3720   Elf_Internal_Sym *isymbuf = NULL;
3721   struct alpha_elf_got_entry **local_got_entries;
3722   struct alpha_relax_info info;
3723   struct alpha_elf_link_hash_table * htab;
3724   int relax_pass;
3725 
3726   htab = alpha_elf_hash_table (link_info);
3727   if (htab == NULL)
3728     return false;
3729 
3730   /* There's nothing to change, yet.  */
3731   *again = false;
3732 
3733   if (bfd_link_relocatable (link_info)
3734       || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3735 	  != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3736       || sec->reloc_count == 0)
3737     return true;
3738 
3739   BFD_ASSERT (is_alpha_elf (abfd));
3740   relax_pass = link_info->relax_pass;
3741 
3742   /* Make sure our GOT and PLT tables are up-to-date.  */
3743   if (htab->relax_trip != link_info->relax_trip)
3744     {
3745       htab->relax_trip = link_info->relax_trip;
3746 
3747       /* This should never fail after the initial round, since the only error
3748 	 is GOT overflow, and relaxation only shrinks the table.  However, we
3749 	 may only merge got sections during the first pass.  If we merge
3750 	 sections after we've created GPREL relocs, the GP for the merged
3751 	 section backs up which may put the relocs out of range.  */
3752       if (!elf64_alpha_size_got_sections (link_info, relax_pass == 0))
3753 	abort ();
3754       if (elf_hash_table (link_info)->dynamic_sections_created)
3755 	{
3756 	  elf64_alpha_size_plt_section (link_info);
3757 	  elf64_alpha_size_rela_got_section (link_info);
3758 	}
3759     }
3760 
3761   symtab_hdr = &elf_symtab_hdr (abfd);
3762   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3763 
3764   /* Load the relocations for this section.  */
3765   internal_relocs = (_bfd_elf_link_read_relocs
3766 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3767 		      link_info->keep_memory));
3768   if (internal_relocs == NULL)
3769     return false;
3770 
3771   memset(&info, 0, sizeof (info));
3772   info.abfd = abfd;
3773   info.sec = sec;
3774   info.link_info = link_info;
3775   info.symtab_hdr = symtab_hdr;
3776   info.relocs = internal_relocs;
3777   info.relend = irelend = internal_relocs + sec->reloc_count;
3778 
3779   /* Find the GP for this object.  Do not store the result back via
3780      _bfd_set_gp_value, since this could change again before final.  */
3781   info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3782   if (info.gotobj)
3783     {
3784       asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3785       info.gp = (sgot->output_section->vma
3786 		 + sgot->output_offset
3787 		 + 0x8000);
3788     }
3789 
3790   /* Get the section contents.  */
3791   if (elf_section_data (sec)->this_hdr.contents != NULL)
3792     info.contents = elf_section_data (sec)->this_hdr.contents;
3793   else
3794     {
3795       if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3796 	goto error_return;
3797     }
3798 
3799   for (irel = internal_relocs; irel < irelend; irel++)
3800     {
3801       bfd_vma symval;
3802       struct alpha_elf_got_entry *gotent;
3803       unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3804       unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3805 
3806       /* Early exit for unhandled or unrelaxable relocations.  */
3807       if (r_type != R_ALPHA_LITERAL)
3808 	{
3809 	  /* We complete everything except LITERAL in the first pass.  */
3810 	  if (relax_pass != 0)
3811 	    continue;
3812 	  if (r_type == R_ALPHA_TLSLDM)
3813 	    {
3814 	      /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3815 		 reloc to the STN_UNDEF (0) symbol so that they all match.  */
3816 	      r_symndx = STN_UNDEF;
3817 	    }
3818 	  else if (r_type != R_ALPHA_GOTDTPREL
3819 		   && r_type != R_ALPHA_GOTTPREL
3820 		   && r_type != R_ALPHA_TLSGD)
3821 	    continue;
3822 	}
3823 
3824       /* Get the value of the symbol referred to by the reloc.  */
3825       if (r_symndx < symtab_hdr->sh_info)
3826 	{
3827 	  /* A local symbol.  */
3828 	  Elf_Internal_Sym *isym;
3829 
3830 	  /* Read this BFD's local symbols.  */
3831 	  if (isymbuf == NULL)
3832 	    {
3833 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3834 	      if (isymbuf == NULL)
3835 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3836 						symtab_hdr->sh_info, 0,
3837 						NULL, NULL, NULL);
3838 	      if (isymbuf == NULL)
3839 		goto error_return;
3840 	    }
3841 
3842 	  isym = isymbuf + r_symndx;
3843 
3844 	  /* Given the symbol for a TLSLDM reloc is ignored, this also
3845 	     means forcing the symbol value to the tp base.  */
3846 	  if (r_type == R_ALPHA_TLSLDM)
3847 	    {
3848 	      info.tsec = bfd_abs_section_ptr;
3849 	      symval = alpha_get_tprel_base (info.link_info);
3850 	    }
3851 	  else
3852 	    {
3853 	      symval = isym->st_value;
3854 	      if (isym->st_shndx == SHN_UNDEF)
3855 		continue;
3856 	      else if (isym->st_shndx == SHN_ABS)
3857 		info.tsec = bfd_abs_section_ptr;
3858 	      else if (isym->st_shndx == SHN_COMMON)
3859 		info.tsec = bfd_com_section_ptr;
3860 	      else
3861 		info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3862 	    }
3863 
3864 	  info.h = NULL;
3865 	  info.other = isym->st_other;
3866 	  if (local_got_entries)
3867 	    info.first_gotent = &local_got_entries[r_symndx];
3868 	  else
3869 	    {
3870 	      info.first_gotent = &info.gotent;
3871 	      info.gotent = NULL;
3872 	    }
3873 	}
3874       else
3875 	{
3876 	  unsigned long indx;
3877 	  struct alpha_elf_link_hash_entry *h;
3878 
3879 	  indx = r_symndx - symtab_hdr->sh_info;
3880 	  h = alpha_elf_sym_hashes (abfd)[indx];
3881 	  BFD_ASSERT (h != NULL);
3882 
3883 	  while (h->root.root.type == bfd_link_hash_indirect
3884 		 || h->root.root.type == bfd_link_hash_warning)
3885 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3886 
3887 	  /* If the symbol is undefined, we can't do anything with it.  */
3888 	  if (h->root.root.type == bfd_link_hash_undefined)
3889 	    continue;
3890 
3891 	  /* If the symbol isn't defined in the current module,
3892 	     again we can't do anything.  */
3893 	  if (h->root.root.type == bfd_link_hash_undefweak)
3894 	    {
3895 	      info.tsec = bfd_abs_section_ptr;
3896 	      symval = 0;
3897 	    }
3898 	  else if (!h->root.def_regular)
3899 	    {
3900 	      /* Except for TLSGD relocs, which can sometimes be
3901 		 relaxed to GOTTPREL relocs.  */
3902 	      if (r_type != R_ALPHA_TLSGD)
3903 		continue;
3904 	      info.tsec = bfd_abs_section_ptr;
3905 	      symval = 0;
3906 	    }
3907 	  else
3908 	    {
3909 	      info.tsec = h->root.root.u.def.section;
3910 	      symval = h->root.root.u.def.value;
3911 	    }
3912 
3913 	  info.h = h;
3914 	  info.other = h->root.other;
3915 	  info.first_gotent = &h->got_entries;
3916 	}
3917 
3918       /* Search for the got entry to be used by this relocation.  */
3919       for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3920 	if (gotent->gotobj == info.gotobj
3921 	    && gotent->reloc_type == r_type
3922 	    && gotent->addend == irel->r_addend)
3923 	  break;
3924       info.gotent = gotent;
3925 
3926       symval += info.tsec->output_section->vma + info.tsec->output_offset;
3927       symval += irel->r_addend;
3928 
3929       switch (r_type)
3930 	{
3931 	case R_ALPHA_LITERAL:
3932 	  BFD_ASSERT(info.gotent != NULL);
3933 
3934 	  /* If there exist LITUSE relocations immediately following, this
3935 	     opens up all sorts of interesting optimizations, because we
3936 	     now know every location that this address load is used.  */
3937 	  if (irel+1 < irelend
3938 	      && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3939 	    {
3940 	      if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3941 		goto error_return;
3942 	    }
3943 	  else
3944 	    {
3945 	      if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3946 		goto error_return;
3947 	    }
3948 	  break;
3949 
3950 	case R_ALPHA_GOTDTPREL:
3951 	case R_ALPHA_GOTTPREL:
3952 	  BFD_ASSERT(info.gotent != NULL);
3953 	  if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3954 	    goto error_return;
3955 	  break;
3956 
3957 	case R_ALPHA_TLSGD:
3958 	case R_ALPHA_TLSLDM:
3959 	  BFD_ASSERT(info.gotent != NULL);
3960 	  if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3961 					       r_type == R_ALPHA_TLSGD))
3962 	    goto error_return;
3963 	  break;
3964 	}
3965     }
3966 
3967   if (isymbuf != NULL
3968       && symtab_hdr->contents != (unsigned char *) isymbuf)
3969     {
3970       if (!link_info->keep_memory)
3971 	free (isymbuf);
3972       else
3973 	{
3974 	  /* Cache the symbols for elf_link_input_bfd.  */
3975 	  symtab_hdr->contents = (unsigned char *) isymbuf;
3976 	}
3977     }
3978 
3979   if (info.contents != NULL
3980       && elf_section_data (sec)->this_hdr.contents != info.contents)
3981     {
3982       if (!info.changed_contents && !link_info->keep_memory)
3983 	free (info.contents);
3984       else
3985 	{
3986 	  /* Cache the section contents for elf_link_input_bfd.  */
3987 	  elf_section_data (sec)->this_hdr.contents = info.contents;
3988 	}
3989     }
3990 
3991   if (elf_section_data (sec)->relocs != internal_relocs)
3992     {
3993       if (!info.changed_relocs)
3994 	free (internal_relocs);
3995       else
3996 	elf_section_data (sec)->relocs = internal_relocs;
3997     }
3998 
3999   *again = info.changed_contents || info.changed_relocs;
4000 
4001   return true;
4002 
4003  error_return:
4004   if (symtab_hdr->contents != (unsigned char *) isymbuf)
4005     free (isymbuf);
4006   if (elf_section_data (sec)->this_hdr.contents != info.contents)
4007     free (info.contents);
4008   if (elf_section_data (sec)->relocs != internal_relocs)
4009     free (internal_relocs);
4010   return false;
4011 }
4012 
4013 /* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4014    into the next available slot in SREL.  */
4015 
4016 static void
4017 elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4018 			 asection *sec, asection *srel, bfd_vma offset,
4019 			 long dynindx, long rtype, bfd_vma addend)
4020 {
4021   Elf_Internal_Rela outrel;
4022   bfd_byte *loc;
4023 
4024   BFD_ASSERT (srel != NULL);
4025 
4026   outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4027   outrel.r_addend = addend;
4028 
4029   offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4030   if ((offset | 1) != (bfd_vma) -1)
4031     outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4032   else
4033     memset (&outrel, 0, sizeof (outrel));
4034 
4035   loc = srel->contents;
4036   loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4037   bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4038   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4039 }
4040 
4041 /* Relocate an Alpha ELF section for a relocatable link.
4042 
4043    We don't have to change anything unless the reloc is against a section
4044    symbol, in which case we have to adjust according to where the section
4045    symbol winds up in the output section.  */
4046 
4047 static int
4048 elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4049 				struct bfd_link_info *info ATTRIBUTE_UNUSED,
4050 				bfd *input_bfd, asection *input_section,
4051 				bfd_byte *contents ATTRIBUTE_UNUSED,
4052 				Elf_Internal_Rela *relocs,
4053 				Elf_Internal_Sym *local_syms,
4054 				asection **local_sections)
4055 {
4056   unsigned long symtab_hdr_sh_info;
4057   Elf_Internal_Rela *rel;
4058   Elf_Internal_Rela *relend;
4059   struct elf_link_hash_entry **sym_hashes;
4060   bool ret_val = true;
4061 
4062   symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4063   sym_hashes = elf_sym_hashes (input_bfd);
4064 
4065   relend = relocs + input_section->reloc_count;
4066   for (rel = relocs; rel < relend; rel++)
4067     {
4068       unsigned long r_symndx;
4069       Elf_Internal_Sym *sym;
4070       asection *sec;
4071       unsigned long r_type;
4072 
4073       r_type = ELF64_R_TYPE (rel->r_info);
4074       if (r_type >= R_ALPHA_max)
4075 	{
4076 	  _bfd_error_handler
4077 	    /* xgettext:c-format */
4078 	    (_("%pB: unsupported relocation type %#x"),
4079 	     input_bfd, (int) r_type);
4080 	  bfd_set_error (bfd_error_bad_value);
4081 	  ret_val = false;
4082 	  continue;
4083 	}
4084 
4085       /* The symbol associated with GPDISP and LITUSE is
4086 	 immaterial.  Only the addend is significant.  */
4087       if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4088 	continue;
4089 
4090       r_symndx = ELF64_R_SYM (rel->r_info);
4091       if (r_symndx < symtab_hdr_sh_info)
4092 	{
4093 	  sym = local_syms + r_symndx;
4094 	  sec = local_sections[r_symndx];
4095 	}
4096       else
4097 	{
4098 	  struct elf_link_hash_entry *h;
4099 
4100 	  h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4101 
4102 	  while (h->root.type == bfd_link_hash_indirect
4103 		 || h->root.type == bfd_link_hash_warning)
4104 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4105 
4106 	  if (h->root.type != bfd_link_hash_defined
4107 	      && h->root.type != bfd_link_hash_defweak)
4108 	    continue;
4109 
4110 	  sym = NULL;
4111 	  sec = h->root.u.def.section;
4112 	}
4113 
4114       if (sec != NULL && discarded_section (sec))
4115 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4116 					 rel, 1, relend,
4117 					 elf64_alpha_howto_table + r_type, 0,
4118 					 contents);
4119 
4120       if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4121 	rel->r_addend += sec->output_offset;
4122     }
4123 
4124   return ret_val;
4125 }
4126 
4127 /* Relocate an Alpha ELF section.  */
4128 
4129 static int
4130 elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4131 			      bfd *input_bfd, asection *input_section,
4132 			      bfd_byte *contents, Elf_Internal_Rela *relocs,
4133 			      Elf_Internal_Sym *local_syms,
4134 			      asection **local_sections)
4135 {
4136   Elf_Internal_Shdr *symtab_hdr;
4137   Elf_Internal_Rela *rel;
4138   Elf_Internal_Rela *relend;
4139   asection *sgot, *srel, *srelgot;
4140   bfd *dynobj, *gotobj;
4141   bfd_vma gp, tp_base, dtp_base;
4142   struct alpha_elf_got_entry **local_got_entries;
4143   bool ret_val;
4144 
4145   BFD_ASSERT (is_alpha_elf (input_bfd));
4146 
4147   /* Handle relocatable links with a smaller loop.  */
4148   if (bfd_link_relocatable (info))
4149     return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4150 					   input_section, contents, relocs,
4151 					   local_syms, local_sections);
4152 
4153   /* This is a final link.  */
4154 
4155   ret_val = true;
4156 
4157   symtab_hdr = &elf_symtab_hdr (input_bfd);
4158 
4159   dynobj = elf_hash_table (info)->dynobj;
4160   srelgot = elf_hash_table (info)->srelgot;
4161 
4162   if (input_section->flags & SEC_ALLOC)
4163     {
4164       const char *section_name;
4165       section_name = (bfd_elf_string_from_elf_section
4166 		      (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4167 		       _bfd_elf_single_rel_hdr (input_section)->sh_name));
4168       BFD_ASSERT(section_name != NULL);
4169       srel = bfd_get_linker_section (dynobj, section_name);
4170     }
4171   else
4172     srel = NULL;
4173 
4174   /* Find the gp value for this input bfd.  */
4175   gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4176   if (gotobj)
4177     {
4178       sgot = alpha_elf_tdata (gotobj)->got;
4179       gp = _bfd_get_gp_value (gotobj);
4180       if (gp == 0)
4181 	{
4182 	  gp = (sgot->output_section->vma
4183 		+ sgot->output_offset
4184 		+ 0x8000);
4185 	  _bfd_set_gp_value (gotobj, gp);
4186 	}
4187     }
4188   else
4189     {
4190       sgot = NULL;
4191       gp = 0;
4192     }
4193 
4194   local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4195 
4196   if (elf_hash_table (info)->tls_sec != NULL)
4197     {
4198       dtp_base = alpha_get_dtprel_base (info);
4199       tp_base = alpha_get_tprel_base (info);
4200     }
4201   else
4202     dtp_base = tp_base = 0;
4203 
4204   relend = relocs + input_section->reloc_count;
4205   for (rel = relocs; rel < relend; rel++)
4206     {
4207       struct alpha_elf_link_hash_entry *h = NULL;
4208       struct alpha_elf_got_entry *gotent;
4209       bfd_reloc_status_type r;
4210       reloc_howto_type *howto;
4211       unsigned long r_symndx;
4212       Elf_Internal_Sym *sym = NULL;
4213       asection *sec = NULL;
4214       bfd_vma value;
4215       bfd_vma addend;
4216       bool dynamic_symbol_p;
4217       bool unresolved_reloc = false;
4218       bool undef_weak_ref = false;
4219       unsigned long r_type;
4220 
4221       r_type = ELF64_R_TYPE(rel->r_info);
4222       if (r_type >= R_ALPHA_max)
4223 	{
4224 	  _bfd_error_handler
4225 	    /* xgettext:c-format */
4226 	    (_("%pB: unsupported relocation type %#x"),
4227 	     input_bfd, (int) r_type);
4228 	  bfd_set_error (bfd_error_bad_value);
4229 	  ret_val = false;
4230 	  continue;
4231 	}
4232 
4233       howto = elf64_alpha_howto_table + r_type;
4234       r_symndx = ELF64_R_SYM(rel->r_info);
4235 
4236       /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4237 	 reloc to the STN_UNDEF (0) symbol so that they all match.  */
4238       if (r_type == R_ALPHA_TLSLDM)
4239 	r_symndx = STN_UNDEF;
4240 
4241       if (r_symndx < symtab_hdr->sh_info)
4242 	{
4243 	  asection *msec;
4244 	  sym = local_syms + r_symndx;
4245 	  sec = local_sections[r_symndx];
4246 	  msec = sec;
4247 	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4248 
4249 	  /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4250 	     this is hackery from relax_section.  Force the value to
4251 	     be the tls module base.  */
4252 	  if (r_symndx == STN_UNDEF
4253 	      && (r_type == R_ALPHA_TLSLDM
4254 		  || r_type == R_ALPHA_GOTTPREL
4255 		  || r_type == R_ALPHA_TPREL64
4256 		  || r_type == R_ALPHA_TPRELHI
4257 		  || r_type == R_ALPHA_TPRELLO
4258 		  || r_type == R_ALPHA_TPREL16))
4259 	    value = dtp_base;
4260 
4261 	  if (local_got_entries)
4262 	    gotent = local_got_entries[r_symndx];
4263 	  else
4264 	    gotent = NULL;
4265 
4266 	  /* Need to adjust local GOT entries' addends for SEC_MERGE
4267 	     unless it has been done already.  */
4268 	  if ((sec->flags & SEC_MERGE)
4269 	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4270 	      && sec->sec_info_type == SEC_INFO_TYPE_MERGE
4271 	      && gotent
4272 	      && !gotent->reloc_xlated)
4273 	    {
4274 	      struct alpha_elf_got_entry *ent;
4275 
4276 	      for (ent = gotent; ent; ent = ent->next)
4277 		{
4278 		  ent->reloc_xlated = 1;
4279 		  if (ent->use_count == 0)
4280 		    continue;
4281 		  msec = sec;
4282 		  ent->addend =
4283 		    _bfd_merged_section_offset (output_bfd, &msec,
4284 						elf_section_data (sec)->
4285 						  sec_info,
4286 						sym->st_value + ent->addend);
4287 		  ent->addend -= sym->st_value;
4288 		  ent->addend += msec->output_section->vma
4289 				 + msec->output_offset
4290 				 - sec->output_section->vma
4291 				 - sec->output_offset;
4292 		}
4293 	    }
4294 
4295 	  dynamic_symbol_p = false;
4296 	}
4297       else
4298 	{
4299 	  bool warned, ignored;
4300 	  struct elf_link_hash_entry *hh;
4301 	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4302 
4303 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4304 				   r_symndx, symtab_hdr, sym_hashes,
4305 				   hh, sec, value,
4306 				   unresolved_reloc, warned, ignored);
4307 
4308 	  if (warned)
4309 	    continue;
4310 
4311 	  if (value == 0
4312 	      && ! unresolved_reloc
4313 	      && hh->root.type == bfd_link_hash_undefweak)
4314 	    undef_weak_ref = true;
4315 
4316 	  h = (struct alpha_elf_link_hash_entry *) hh;
4317 	  dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4318 	  gotent = h->got_entries;
4319 	}
4320 
4321       if (sec != NULL && discarded_section (sec))
4322 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4323 					 rel, 1, relend, howto, 0, contents);
4324 
4325       addend = rel->r_addend;
4326       value += addend;
4327 
4328       /* Search for the proper got entry.  */
4329       for (; gotent ; gotent = gotent->next)
4330 	if (gotent->gotobj == gotobj
4331 	    && gotent->reloc_type == r_type
4332 	    && gotent->addend == addend)
4333 	  break;
4334 
4335       switch (r_type)
4336 	{
4337 	case R_ALPHA_GPDISP:
4338 	  {
4339 	    bfd_byte *p_ldah, *p_lda;
4340 
4341 	    BFD_ASSERT(gp != 0);
4342 
4343 	    value = (input_section->output_section->vma
4344 		     + input_section->output_offset
4345 		     + rel->r_offset);
4346 
4347 	    p_ldah = contents + rel->r_offset;
4348 	    p_lda = p_ldah + rel->r_addend;
4349 
4350 	    r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4351 					     p_ldah, p_lda);
4352 	  }
4353 	  break;
4354 
4355 	case R_ALPHA_LITERAL:
4356 	  BFD_ASSERT(sgot != NULL);
4357 	  BFD_ASSERT(gp != 0);
4358 	  BFD_ASSERT(gotent != NULL);
4359 	  BFD_ASSERT(gotent->use_count >= 1);
4360 
4361 	  if (!gotent->reloc_done)
4362 	    {
4363 	      gotent->reloc_done = 1;
4364 
4365 	      bfd_put_64 (output_bfd, value,
4366 			  sgot->contents + gotent->got_offset);
4367 
4368 	      /* If the symbol has been forced local, output a
4369 		 RELATIVE reloc, otherwise it will be handled in
4370 		 finish_dynamic_symbol.  */
4371 	      if (bfd_link_pic (info)
4372 		  && !dynamic_symbol_p
4373 		  && !undef_weak_ref)
4374 		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4375 					 gotent->got_offset, 0,
4376 					 R_ALPHA_RELATIVE, value);
4377 	    }
4378 
4379 	  value = (sgot->output_section->vma
4380 		   + sgot->output_offset
4381 		   + gotent->got_offset);
4382 	  value -= gp;
4383 	  goto default_reloc;
4384 
4385 	case R_ALPHA_GPREL32:
4386 	case R_ALPHA_GPREL16:
4387 	case R_ALPHA_GPRELLOW:
4388 	  if (dynamic_symbol_p)
4389 	    {
4390 	      _bfd_error_handler
4391 		/* xgettext:c-format */
4392 		(_("%pB: gp-relative relocation against dynamic symbol %s"),
4393 		 input_bfd, h->root.root.root.string);
4394 	      ret_val = false;
4395 	    }
4396 	  BFD_ASSERT(gp != 0);
4397 	  value -= gp;
4398 	  goto default_reloc;
4399 
4400 	case R_ALPHA_GPRELHIGH:
4401 	  if (dynamic_symbol_p)
4402 	    {
4403 	      _bfd_error_handler
4404 		/* xgettext:c-format */
4405 		(_("%pB: gp-relative relocation against dynamic symbol %s"),
4406 		 input_bfd, h->root.root.root.string);
4407 	      ret_val = false;
4408 	    }
4409 	  BFD_ASSERT(gp != 0);
4410 	  value -= gp;
4411 	  value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4412 	  goto default_reloc;
4413 
4414 	case R_ALPHA_HINT:
4415 	  /* A call to a dynamic symbol is definitely out of range of
4416 	     the 16-bit displacement.  Don't bother writing anything.  */
4417 	  if (dynamic_symbol_p)
4418 	    {
4419 	      r = bfd_reloc_ok;
4420 	      break;
4421 	    }
4422 	  /* The regular PC-relative stuff measures from the start of
4423 	     the instruction rather than the end.  */
4424 	  value -= 4;
4425 	  goto default_reloc;
4426 
4427 	case R_ALPHA_BRADDR:
4428 	  if (dynamic_symbol_p)
4429 	    {
4430 	      _bfd_error_handler
4431 		/* xgettext:c-format */
4432 		(_("%pB: pc-relative relocation against dynamic symbol %s"),
4433 		 input_bfd, h->root.root.root.string);
4434 	      ret_val = false;
4435 	    }
4436 	  /* The regular PC-relative stuff measures from the start of
4437 	     the instruction rather than the end.  */
4438 	  value -= 4;
4439 	  goto default_reloc;
4440 
4441 	case R_ALPHA_BRSGP:
4442 	  {
4443 	    int other;
4444 	    const char *name;
4445 
4446 	    /* The regular PC-relative stuff measures from the start of
4447 	       the instruction rather than the end.  */
4448 	    value -= 4;
4449 
4450 	    /* The source and destination gp must be the same.  Note that
4451 	       the source will always have an assigned gp, since we forced
4452 	       one in check_relocs, but that the destination may not, as
4453 	       it might not have had any relocations at all.  Also take
4454 	       care not to crash if H is an undefined symbol.  */
4455 	    if (h != NULL && sec != NULL
4456 		&& alpha_elf_tdata (sec->owner)->gotobj
4457 		&& gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4458 	      {
4459 		_bfd_error_handler
4460 		  /* xgettext:c-format */
4461 		  (_("%pB: change in gp: BRSGP %s"),
4462 		   input_bfd, h->root.root.root.string);
4463 		ret_val = false;
4464 	      }
4465 
4466 	    /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4467 	    if (h != NULL)
4468 	      other = h->root.other;
4469 	    else
4470 	      other = sym->st_other;
4471 	    switch (other & STO_ALPHA_STD_GPLOAD)
4472 	      {
4473 	      case STO_ALPHA_NOPV:
4474 		break;
4475 	      case STO_ALPHA_STD_GPLOAD:
4476 		value += 8;
4477 		break;
4478 	      default:
4479 		if (h != NULL)
4480 		  name = h->root.root.root.string;
4481 		else
4482 		  {
4483 		    name = (bfd_elf_string_from_elf_section
4484 			    (input_bfd, symtab_hdr->sh_link, sym->st_name));
4485 		    if (name == NULL)
4486 		      name = _("<unknown>");
4487 		    else if (name[0] == 0)
4488 		      name = bfd_section_name (sec);
4489 		  }
4490 		_bfd_error_handler
4491 		  /* xgettext:c-format */
4492 		  (_("%pB: !samegp reloc against symbol without .prologue: %s"),
4493 		   input_bfd, name);
4494 		ret_val = false;
4495 		break;
4496 	      }
4497 
4498 	    goto default_reloc;
4499 	  }
4500 
4501 	case R_ALPHA_REFLONG:
4502 	case R_ALPHA_REFQUAD:
4503 	case R_ALPHA_DTPREL64:
4504 	case R_ALPHA_TPREL64:
4505 	  {
4506 	    long dynindx, dyntype = r_type;
4507 	    bfd_vma dynaddend;
4508 
4509 	    /* Careful here to remember RELATIVE relocations for global
4510 	       variables for symbolic shared objects.  */
4511 
4512 	    if (dynamic_symbol_p)
4513 	      {
4514 		BFD_ASSERT(h->root.dynindx != -1);
4515 		dynindx = h->root.dynindx;
4516 		dynaddend = addend;
4517 		addend = 0, value = 0;
4518 	      }
4519 	    else if (r_type == R_ALPHA_DTPREL64)
4520 	      {
4521 		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4522 		value -= dtp_base;
4523 		goto default_reloc;
4524 	      }
4525 	    else if (r_type == R_ALPHA_TPREL64)
4526 	      {
4527 		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4528 		if (!bfd_link_dll (info))
4529 		  {
4530 		    value -= tp_base;
4531 		    goto default_reloc;
4532 		  }
4533 		dynindx = 0;
4534 		dynaddend = value - dtp_base;
4535 	      }
4536 	    else if (bfd_link_pic (info)
4537 		     && r_symndx != STN_UNDEF
4538 		     && (input_section->flags & SEC_ALLOC)
4539 		     && !undef_weak_ref
4540 		     && !(unresolved_reloc
4541 			  && (_bfd_elf_section_offset (output_bfd, info,
4542 						       input_section,
4543 						       rel->r_offset)
4544 			      == (bfd_vma) -1)))
4545 	      {
4546 		if (r_type == R_ALPHA_REFLONG)
4547 		  {
4548 		    _bfd_error_handler
4549 		      /* xgettext:c-format */
4550 		      (_("%pB: unhandled dynamic relocation against %s"),
4551 		       input_bfd,
4552 		       h->root.root.root.string);
4553 		    ret_val = false;
4554 		  }
4555 		dynindx = 0;
4556 		dyntype = R_ALPHA_RELATIVE;
4557 		dynaddend = value;
4558 	      }
4559 	    else
4560 	      goto default_reloc;
4561 
4562 	    if (input_section->flags & SEC_ALLOC)
4563 	      elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4564 				       srel, rel->r_offset, dynindx,
4565 				       dyntype, dynaddend);
4566 	  }
4567 	  goto default_reloc;
4568 
4569 	case R_ALPHA_SREL16:
4570 	case R_ALPHA_SREL32:
4571 	case R_ALPHA_SREL64:
4572 	  if (dynamic_symbol_p)
4573 	    {
4574 	      _bfd_error_handler
4575 		/* xgettext:c-format */
4576 		(_("%pB: pc-relative relocation against dynamic symbol %s"),
4577 		 input_bfd, h->root.root.root.string);
4578 	      ret_val = false;
4579 	    }
4580 	  else if (bfd_link_pic (info)
4581 		   && undef_weak_ref)
4582 	    {
4583 	      _bfd_error_handler
4584 		/* xgettext:c-format */
4585 		(_("%pB: pc-relative relocation against undefined weak symbol %s"),
4586 		 input_bfd, h->root.root.root.string);
4587 	      ret_val = false;
4588 	    }
4589 
4590 
4591 	  /* ??? .eh_frame references to discarded sections will be smashed
4592 	     to relocations against SHN_UNDEF.  The .eh_frame format allows
4593 	     NULL to be encoded as 0 in any format, so this works here.  */
4594 	  if (r_symndx == STN_UNDEF
4595 	      || (unresolved_reloc
4596 		  && _bfd_elf_section_offset (output_bfd, info,
4597 					      input_section,
4598 					      rel->r_offset) == (bfd_vma) -1))
4599 	    howto = (elf64_alpha_howto_table
4600 		     + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4601 	  goto default_reloc;
4602 
4603 	case R_ALPHA_TLSLDM:
4604 	  /* Ignore the symbol for the relocation.  The result is always
4605 	     the current module.  */
4606 	  dynamic_symbol_p = 0;
4607 	  /* FALLTHRU */
4608 
4609 	case R_ALPHA_TLSGD:
4610 	  if (!gotent->reloc_done)
4611 	    {
4612 	      gotent->reloc_done = 1;
4613 
4614 	      /* Note that the module index for the main program is 1.  */
4615 	      bfd_put_64 (output_bfd,
4616 			  !bfd_link_pic (info) && !dynamic_symbol_p,
4617 			  sgot->contents + gotent->got_offset);
4618 
4619 	      /* If the symbol has been forced local, output a
4620 		 DTPMOD64 reloc, otherwise it will be handled in
4621 		 finish_dynamic_symbol.  */
4622 	      if (bfd_link_pic (info) && !dynamic_symbol_p)
4623 		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4624 					 gotent->got_offset, 0,
4625 					 R_ALPHA_DTPMOD64, 0);
4626 
4627 	      if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4628 		value = 0;
4629 	      else
4630 		{
4631 		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4632 		  value -= dtp_base;
4633 		}
4634 	      bfd_put_64 (output_bfd, value,
4635 			  sgot->contents + gotent->got_offset + 8);
4636 	    }
4637 
4638 	  value = (sgot->output_section->vma
4639 		   + sgot->output_offset
4640 		   + gotent->got_offset);
4641 	  value -= gp;
4642 	  goto default_reloc;
4643 
4644 	case R_ALPHA_DTPRELHI:
4645 	case R_ALPHA_DTPRELLO:
4646 	case R_ALPHA_DTPREL16:
4647 	  if (dynamic_symbol_p)
4648 	    {
4649 	      _bfd_error_handler
4650 		/* xgettext:c-format */
4651 		(_("%pB: dtp-relative relocation against dynamic symbol %s"),
4652 		 input_bfd, h->root.root.root.string);
4653 	      ret_val = false;
4654 	    }
4655 	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4656 	  value -= dtp_base;
4657 	  if (r_type == R_ALPHA_DTPRELHI)
4658 	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4659 	  goto default_reloc;
4660 
4661 	case R_ALPHA_TPRELHI:
4662 	case R_ALPHA_TPRELLO:
4663 	case R_ALPHA_TPREL16:
4664 	  if (bfd_link_dll (info))
4665 	    {
4666 	      _bfd_error_handler
4667 		/* xgettext:c-format */
4668 		(_("%pB: TLS local exec code cannot be linked into shared objects"),
4669 		input_bfd);
4670 	      ret_val = false;
4671 	    }
4672 	  else if (dynamic_symbol_p)
4673 	    {
4674 	      _bfd_error_handler
4675 		/* xgettext:c-format */
4676 		(_("%pB: tp-relative relocation against dynamic symbol %s"),
4677 		 input_bfd, h->root.root.root.string);
4678 	      ret_val = false;
4679 	    }
4680 	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4681 	  value -= tp_base;
4682 	  if (r_type == R_ALPHA_TPRELHI)
4683 	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4684 	  goto default_reloc;
4685 
4686 	case R_ALPHA_GOTDTPREL:
4687 	case R_ALPHA_GOTTPREL:
4688 	  BFD_ASSERT(sgot != NULL);
4689 	  BFD_ASSERT(gp != 0);
4690 	  BFD_ASSERT(gotent != NULL);
4691 	  BFD_ASSERT(gotent->use_count >= 1);
4692 
4693 	  if (!gotent->reloc_done)
4694 	    {
4695 	      gotent->reloc_done = 1;
4696 
4697 	      if (dynamic_symbol_p)
4698 		value = 0;
4699 	      else
4700 		{
4701 		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4702 		  if (r_type == R_ALPHA_GOTDTPREL)
4703 		    value -= dtp_base;
4704 		  else if (bfd_link_executable (info))
4705 		    value -= tp_base;
4706 		  else
4707 		    {
4708 		      elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4709 					       gotent->got_offset, 0,
4710 					       R_ALPHA_TPREL64,
4711 					       value - dtp_base);
4712 		      value = 0;
4713 		    }
4714 		}
4715 	      bfd_put_64 (output_bfd, value,
4716 			  sgot->contents + gotent->got_offset);
4717 	    }
4718 
4719 	  value = (sgot->output_section->vma
4720 		   + sgot->output_offset
4721 		   + gotent->got_offset);
4722 	  value -= gp;
4723 	  goto default_reloc;
4724 
4725 	default:
4726 	default_reloc:
4727 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4728 					contents, rel->r_offset, value, 0);
4729 	  break;
4730 	}
4731 
4732       switch (r)
4733 	{
4734 	case bfd_reloc_ok:
4735 	  break;
4736 
4737 	case bfd_reloc_overflow:
4738 	  {
4739 	    const char *name;
4740 
4741 	    /* Don't warn if the overflow is due to pc relative reloc
4742 	       against discarded section.  Section optimization code should
4743 	       handle it.  */
4744 
4745 	    if (r_symndx < symtab_hdr->sh_info
4746 		&& sec != NULL && howto->pc_relative
4747 		&& discarded_section (sec))
4748 	      break;
4749 
4750 	    if (h != NULL)
4751 	      name = NULL;
4752 	    else
4753 	      {
4754 		name = (bfd_elf_string_from_elf_section
4755 			(input_bfd, symtab_hdr->sh_link, sym->st_name));
4756 		if (name == NULL)
4757 		  return false;
4758 		if (*name == '\0')
4759 		  name = bfd_section_name (sec);
4760 	      }
4761 	    (*info->callbacks->reloc_overflow)
4762 	      (info, (h ? &h->root.root : NULL), name, howto->name,
4763 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4764 	  }
4765 	  break;
4766 
4767 	default:
4768 	case bfd_reloc_outofrange:
4769 	  abort ();
4770 	}
4771     }
4772 
4773   return ret_val;
4774 }
4775 
4776 /* Finish up dynamic symbol handling.  We set the contents of various
4777    dynamic sections here.  */
4778 
4779 static bool
4780 elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4781 				   struct elf_link_hash_entry *h,
4782 				   Elf_Internal_Sym *sym)
4783 {
4784   struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4785 
4786   if (h->needs_plt)
4787     {
4788       /* Fill in the .plt entry for this symbol.  */
4789       asection *splt, *sgot, *srel;
4790       Elf_Internal_Rela outrel;
4791       bfd_byte *loc;
4792       bfd_vma got_addr, plt_addr;
4793       bfd_vma plt_index;
4794       struct alpha_elf_got_entry *gotent;
4795 
4796       BFD_ASSERT (h->dynindx != -1);
4797 
4798       splt = elf_hash_table (info)->splt;
4799       BFD_ASSERT (splt != NULL);
4800       srel = elf_hash_table (info)->srelplt;
4801       BFD_ASSERT (srel != NULL);
4802 
4803       for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4804 	if (gotent->reloc_type == R_ALPHA_LITERAL
4805 	    && gotent->use_count > 0)
4806 	  {
4807 	    unsigned int insn;
4808 	    int disp;
4809 
4810 	    sgot = alpha_elf_tdata (gotent->gotobj)->got;
4811 	    BFD_ASSERT (sgot != NULL);
4812 
4813 	    BFD_ASSERT (gotent->got_offset != -1);
4814 	    BFD_ASSERT (gotent->plt_offset != -1);
4815 
4816 	    got_addr = (sgot->output_section->vma
4817 			+ sgot->output_offset
4818 			+ gotent->got_offset);
4819 	    plt_addr = (splt->output_section->vma
4820 			+ splt->output_offset
4821 			+ gotent->plt_offset);
4822 
4823 	    plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4824 
4825 	    /* Fill in the entry in the procedure linkage table.  */
4826 	    if (elf64_alpha_use_secureplt)
4827 	      {
4828 		disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4829 		insn = INSN_AD (INSN_BR, 31, disp);
4830 		bfd_put_32 (output_bfd, insn,
4831 			    splt->contents + gotent->plt_offset);
4832 
4833 		plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4834 			     / NEW_PLT_ENTRY_SIZE);
4835 	      }
4836 	    else if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
4837 	      {
4838 	        long hi, lo;
4839 
4840 	        /* decompose the reloc offset for the plt for ldah+lda */
4841 	        hi = plt_index * sizeof(Elf64_External_Rela);
4842 	        lo = ((hi & 0xffff) ^ 0x8000) - 0x8000;
4843 	        hi = (hi - lo) >> 16;
4844 
4845 	        insn = INSN_ABO (INSN_LDAH, 28, 31, hi);
4846 		bfd_put_32 (output_bfd, insn,
4847 			    splt->contents + gotent->plt_offset);
4848 
4849 	        insn = INSN_ABO (INSN_LDA, 28, 28, lo);
4850 		bfd_put_32 (output_bfd, insn,
4851 			    splt->contents + gotent->plt_offset + 4);
4852 
4853 		disp = -(gotent->plt_offset + 12);
4854 		insn = INSN_AD (INSN_BR, 31, disp);
4855 
4856 		bfd_put_32 (output_bfd, insn,
4857 			    splt->contents + gotent->plt_offset + 8);
4858 
4859 		plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4860 			     / OLD_PLT_ENTRY_SIZE);
4861 	      }
4862 	    else
4863 	      {
4864 		disp = -(gotent->plt_offset + 4);
4865 		insn = INSN_AD (INSN_BR, 28, disp);
4866 		bfd_put_32 (output_bfd, insn,
4867 			    splt->contents + gotent->plt_offset);
4868 		bfd_put_32 (output_bfd, INSN_UNOP,
4869 			    splt->contents + gotent->plt_offset + 4);
4870 		bfd_put_32 (output_bfd, INSN_UNOP,
4871 			    splt->contents + gotent->plt_offset + 8);
4872 
4873 		plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4874 			     / OLD_PLT_ENTRY_SIZE);
4875 	      }
4876 
4877 	    /* Fill in the entry in the .rela.plt section.  */
4878 	    outrel.r_offset = got_addr;
4879 	    outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4880 	    outrel.r_addend = 0;
4881 
4882 	    loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4883 	    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4884 
4885 	    /* Fill in the entry in the .got.  */
4886 	    bfd_put_64 (output_bfd, plt_addr,
4887 			sgot->contents + gotent->got_offset);
4888 	  }
4889     }
4890   else if (alpha_elf_dynamic_symbol_p (h, info))
4891     {
4892       /* Fill in the dynamic relocations for this symbol's .got entries.  */
4893       asection *srel;
4894       struct alpha_elf_got_entry *gotent;
4895 
4896       srel = elf_hash_table (info)->srelgot;
4897       BFD_ASSERT (srel != NULL);
4898 
4899       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4900 	   gotent != NULL;
4901 	   gotent = gotent->next)
4902 	{
4903 	  asection *sgot;
4904 	  long r_type;
4905 
4906 	  if (gotent->use_count == 0)
4907 	    continue;
4908 
4909 	  sgot = alpha_elf_tdata (gotent->gotobj)->got;
4910 
4911 	  r_type = gotent->reloc_type;
4912 	  switch (r_type)
4913 	    {
4914 	    case R_ALPHA_LITERAL:
4915 	      r_type = R_ALPHA_GLOB_DAT;
4916 	      break;
4917 	    case R_ALPHA_TLSGD:
4918 	      r_type = R_ALPHA_DTPMOD64;
4919 	      break;
4920 	    case R_ALPHA_GOTDTPREL:
4921 	      r_type = R_ALPHA_DTPREL64;
4922 	      break;
4923 	    case R_ALPHA_GOTTPREL:
4924 	      r_type = R_ALPHA_TPREL64;
4925 	      break;
4926 	    case R_ALPHA_TLSLDM:
4927 	    default:
4928 	      abort ();
4929 	    }
4930 
4931 	  elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4932 				   gotent->got_offset, h->dynindx,
4933 				   r_type, gotent->addend);
4934 
4935 	  if (gotent->reloc_type == R_ALPHA_TLSGD)
4936 	    elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4937 				     gotent->got_offset + 8, h->dynindx,
4938 				     R_ALPHA_DTPREL64, gotent->addend);
4939 	}
4940     }
4941 
4942   /* Mark some specially defined symbols as absolute.  */
4943   if (h == elf_hash_table (info)->hdynamic
4944       || h == elf_hash_table (info)->hgot
4945       || h == elf_hash_table (info)->hplt)
4946     sym->st_shndx = SHN_ABS;
4947 
4948   return true;
4949 }
4950 
4951 /* Finish up the dynamic sections.  */
4952 
4953 static bool
4954 elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4955 				     struct bfd_link_info *info)
4956 {
4957   bfd *dynobj;
4958   asection *sdyn;
4959 
4960   dynobj = elf_hash_table (info)->dynobj;
4961   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4962 
4963   if (elf_hash_table (info)->dynamic_sections_created)
4964     {
4965       asection *splt, *sgotplt, *srelaplt;
4966       Elf64_External_Dyn *dyncon, *dynconend;
4967       bfd_vma plt_vma, gotplt_vma;
4968 
4969       splt = elf_hash_table (info)->splt;
4970       srelaplt = elf_hash_table (info)->srelplt;
4971       BFD_ASSERT (splt != NULL && sdyn != NULL);
4972 
4973       plt_vma = splt->output_section->vma + splt->output_offset;
4974 
4975       gotplt_vma = 0;
4976       if (elf64_alpha_use_secureplt)
4977 	{
4978 	  sgotplt = elf_hash_table (info)->sgotplt;
4979 	  BFD_ASSERT (sgotplt != NULL);
4980 	  if (sgotplt->size > 0)
4981 	    gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4982 	}
4983 
4984       dyncon = (Elf64_External_Dyn *) sdyn->contents;
4985       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4986       for (; dyncon < dynconend; dyncon++)
4987 	{
4988 	  Elf_Internal_Dyn dyn;
4989 
4990 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4991 
4992 	  switch (dyn.d_tag)
4993 	    {
4994 	    case DT_PLTGOT:
4995 	      dyn.d_un.d_ptr
4996 		= elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4997 	      break;
4998 	    case DT_PLTRELSZ:
4999 	      dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
5000 	      break;
5001 	    case DT_JMPREL:
5002 	      dyn.d_un.d_ptr = srelaplt ? (srelaplt->output_section->vma
5003 					   + srelaplt->output_offset) : 0;
5004 	      break;
5005 	    }
5006 
5007 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5008 	}
5009 
5010       /* Initialize the plt header.  */
5011       if (splt->size > 0)
5012 	{
5013 	  unsigned int insn;
5014 	  int ofs;
5015 
5016 	  if (elf64_alpha_use_secureplt)
5017 	    {
5018 	      ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
5019 
5020 	      insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
5021 	      bfd_put_32 (output_bfd, insn, splt->contents);
5022 
5023 	      insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
5024 	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
5025 
5026 	      insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
5027 	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5028 
5029 	      insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
5030 	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5031 
5032 	      insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
5033 	      bfd_put_32 (output_bfd, insn, splt->contents + 16);
5034 
5035 	      insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
5036 	      bfd_put_32 (output_bfd, insn, splt->contents + 20);
5037 
5038 	      insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
5039 	      bfd_put_32 (output_bfd, insn, splt->contents + 24);
5040 
5041 	      insn = INSN_AB (INSN_JMP, 31, 27);
5042 	      bfd_put_32 (output_bfd, insn, splt->contents + 28);
5043 
5044 	      insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
5045 	      bfd_put_32 (output_bfd, insn, splt->contents + 32);
5046 	    }
5047 	  else
5048 	    {
5049 	      insn = INSN_AD (INSN_BR, 27, 0);	/* br $27, .+4 */
5050 	      bfd_put_32 (output_bfd, insn, splt->contents);
5051 
5052 	      insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5053 	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
5054 
5055 	      insn = INSN_UNOP;
5056 	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5057 
5058 	      insn = INSN_AB (INSN_JMP, 27, 27);
5059 	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5060 
5061 	      /* The next two words will be filled in by ld.so.  */
5062 	      bfd_put_64 (output_bfd, 0, splt->contents + 16);
5063 	      bfd_put_64 (output_bfd, 0, splt->contents + 24);
5064 	    }
5065 
5066 	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5067 	}
5068     }
5069 
5070   return true;
5071 }
5072 
5073 /* We need to use a special link routine to handle the .mdebug section.
5074    We need to merge all instances of these sections together, not write
5075    them all out sequentially.  */
5076 
5077 static bool
5078 elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5079 {
5080   asection *o;
5081   struct bfd_link_order *p;
5082   asection *mdebug_sec;
5083   struct ecoff_debug_info debug;
5084   const struct ecoff_debug_swap *swap
5085     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5086   HDRR *symhdr = &debug.symbolic_header;
5087   void * mdebug_handle = NULL;
5088   struct alpha_elf_link_hash_table * htab;
5089 
5090   htab = alpha_elf_hash_table (info);
5091   if (htab == NULL)
5092     return false;
5093 
5094   /* Go through the sections and collect the mdebug information.  */
5095   mdebug_sec = NULL;
5096   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5097     {
5098       if (strcmp (o->name, ".mdebug") == 0)
5099 	{
5100 	  struct extsym_info einfo;
5101 
5102 	  /* We have found the .mdebug section in the output file.
5103 	     Look through all the link_orders comprising it and merge
5104 	     the information together.  */
5105 	  symhdr->magic = swap->sym_magic;
5106 	  /* FIXME: What should the version stamp be?  */
5107 	  symhdr->vstamp = 0;
5108 	  symhdr->ilineMax = 0;
5109 	  symhdr->cbLine = 0;
5110 	  symhdr->idnMax = 0;
5111 	  symhdr->ipdMax = 0;
5112 	  symhdr->isymMax = 0;
5113 	  symhdr->ioptMax = 0;
5114 	  symhdr->iauxMax = 0;
5115 	  symhdr->issMax = 0;
5116 	  symhdr->issExtMax = 0;
5117 	  symhdr->ifdMax = 0;
5118 	  symhdr->crfd = 0;
5119 	  symhdr->iextMax = 0;
5120 
5121 	  /* We accumulate the debugging information itself in the
5122 	     debug_info structure.  */
5123 	  debug.line = NULL;
5124 	  debug.external_dnr = NULL;
5125 	  debug.external_pdr = NULL;
5126 	  debug.external_sym = NULL;
5127 	  debug.external_opt = NULL;
5128 	  debug.external_aux = NULL;
5129 	  debug.ss = NULL;
5130 	  debug.ssext = debug.ssext_end = NULL;
5131 	  debug.external_fdr = NULL;
5132 	  debug.external_rfd = NULL;
5133 	  debug.external_ext = debug.external_ext_end = NULL;
5134 
5135 	  mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5136 	  if (mdebug_handle == NULL)
5137 	    return false;
5138 
5139 	  if (1)
5140 	    {
5141 	      asection *s;
5142 	      EXTR esym;
5143 	      bfd_vma last = 0;
5144 	      unsigned int i;
5145 	      static const char * const name[] =
5146 		{
5147 		  ".text", ".init", ".fini", ".data",
5148 		  ".rodata", ".sdata", ".sbss", ".bss"
5149 		};
5150 	      static const int sc[] = { scText, scInit, scFini, scData,
5151 					  scRData, scSData, scSBss, scBss };
5152 
5153 	      esym.jmptbl = 0;
5154 	      esym.cobol_main = 0;
5155 	      esym.weakext = 0;
5156 	      esym.reserved = 0;
5157 	      esym.ifd = ifdNil;
5158 	      esym.asym.iss = issNil;
5159 	      esym.asym.st = stLocal;
5160 	      esym.asym.reserved = 0;
5161 	      esym.asym.index = indexNil;
5162 	      for (i = 0; i < 8; i++)
5163 		{
5164 		  esym.asym.sc = sc[i];
5165 		  s = bfd_get_section_by_name (abfd, name[i]);
5166 		  if (s != NULL)
5167 		    {
5168 		      esym.asym.value = s->vma;
5169 		      last = s->vma + s->size;
5170 		    }
5171 		  else
5172 		    esym.asym.value = last;
5173 
5174 		  if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5175 						      name[i], &esym))
5176 		    return false;
5177 		}
5178 	    }
5179 
5180 	  for (p = o->map_head.link_order;
5181 	       p != (struct bfd_link_order *) NULL;
5182 	       p = p->next)
5183 	    {
5184 	      asection *input_section;
5185 	      bfd *input_bfd;
5186 	      const struct ecoff_debug_swap *input_swap;
5187 	      struct ecoff_debug_info input_debug;
5188 	      char *eraw_src;
5189 	      char *eraw_end;
5190 
5191 	      if (p->type != bfd_indirect_link_order)
5192 		{
5193 		  if (p->type == bfd_data_link_order)
5194 		    continue;
5195 		  abort ();
5196 		}
5197 
5198 	      input_section = p->u.indirect.section;
5199 	      input_bfd = input_section->owner;
5200 
5201 	      if (! is_alpha_elf (input_bfd))
5202 		/* I don't know what a non ALPHA ELF bfd would be
5203 		   doing with a .mdebug section, but I don't really
5204 		   want to deal with it.  */
5205 		continue;
5206 
5207 	      input_swap = (get_elf_backend_data (input_bfd)
5208 			    ->elf_backend_ecoff_debug_swap);
5209 
5210 	      BFD_ASSERT (p->size == input_section->size);
5211 
5212 	      /* The ECOFF linking code expects that we have already
5213 		 read in the debugging information and set up an
5214 		 ecoff_debug_info structure, so we do that now.  */
5215 	      if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5216 						&input_debug))
5217 		return false;
5218 
5219 	      if (! (bfd_ecoff_debug_accumulate
5220 		     (mdebug_handle, abfd, &debug, swap, input_bfd,
5221 		      &input_debug, input_swap, info)))
5222 		return false;
5223 
5224 	      /* Loop through the external symbols.  For each one with
5225 		 interesting information, try to find the symbol in
5226 		 the linker global hash table and save the information
5227 		 for the output external symbols.  */
5228 	      eraw_src = (char *) input_debug.external_ext;
5229 	      eraw_end = (eraw_src
5230 			  + (input_debug.symbolic_header.iextMax
5231 			     * input_swap->external_ext_size));
5232 	      for (;
5233 		   eraw_src < eraw_end;
5234 		   eraw_src += input_swap->external_ext_size)
5235 		{
5236 		  EXTR ext;
5237 		  const char *name;
5238 		  struct alpha_elf_link_hash_entry *h;
5239 
5240 		  (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
5241 		  if (ext.asym.sc == scNil
5242 		      || ext.asym.sc == scUndefined
5243 		      || ext.asym.sc == scSUndefined)
5244 		    continue;
5245 
5246 		  name = input_debug.ssext + ext.asym.iss;
5247 		  h = alpha_elf_link_hash_lookup (htab, name, false, false, true);
5248 		  if (h == NULL || h->esym.ifd != -2)
5249 		    continue;
5250 
5251 		  if (ext.ifd != -1)
5252 		    {
5253 		      BFD_ASSERT (ext.ifd
5254 				  < input_debug.symbolic_header.ifdMax);
5255 		      ext.ifd = input_debug.ifdmap[ext.ifd];
5256 		    }
5257 
5258 		  h->esym = ext;
5259 		}
5260 
5261 	      /* Free up the information we just read.  */
5262 	      free (input_debug.line);
5263 	      free (input_debug.external_dnr);
5264 	      free (input_debug.external_pdr);
5265 	      free (input_debug.external_sym);
5266 	      free (input_debug.external_opt);
5267 	      free (input_debug.external_aux);
5268 	      free (input_debug.ss);
5269 	      free (input_debug.ssext);
5270 	      free (input_debug.external_fdr);
5271 	      free (input_debug.external_rfd);
5272 	      free (input_debug.external_ext);
5273 
5274 	      /* Hack: reset the SEC_HAS_CONTENTS flag so that
5275 		 elf_link_input_bfd ignores this section.  */
5276 	      input_section->flags &=~ SEC_HAS_CONTENTS;
5277 	    }
5278 
5279 	  /* Build the external symbol information.  */
5280 	  einfo.abfd = abfd;
5281 	  einfo.info = info;
5282 	  einfo.debug = &debug;
5283 	  einfo.swap = swap;
5284 	  einfo.failed = false;
5285 	  elf_link_hash_traverse (elf_hash_table (info),
5286 				  elf64_alpha_output_extsym,
5287 				  &einfo);
5288 	  if (einfo.failed)
5289 	    return false;
5290 
5291 	  /* Set the size of the .mdebug section.  */
5292 	  o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5293 
5294 	  /* Skip this section later on (I don't think this currently
5295 	     matters, but someday it might).  */
5296 	  o->map_head.link_order = (struct bfd_link_order *) NULL;
5297 
5298 	  mdebug_sec = o;
5299 	}
5300     }
5301 
5302   /* Invoke the regular ELF backend linker to do all the work.  */
5303   if (! bfd_elf_final_link (abfd, info))
5304     return false;
5305 
5306   /* Now write out the computed sections.  */
5307 
5308   /* The .got subsections...  */
5309   {
5310     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5311     for (i = htab->got_list;
5312 	 i != NULL;
5313 	 i = alpha_elf_tdata(i)->got_link_next)
5314       {
5315 	asection *sgot;
5316 
5317 	/* elf_bfd_final_link already did everything in dynobj.  */
5318 	if (i == dynobj)
5319 	  continue;
5320 
5321 	sgot = alpha_elf_tdata(i)->got;
5322 	if (! bfd_set_section_contents (abfd, sgot->output_section,
5323 					sgot->contents,
5324 					(file_ptr) sgot->output_offset,
5325 					sgot->size))
5326 	  return false;
5327       }
5328   }
5329 
5330   if (mdebug_sec != (asection *) NULL)
5331     {
5332       BFD_ASSERT (abfd->output_has_begun);
5333       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5334 					       swap, info,
5335 					       mdebug_sec->filepos))
5336 	return false;
5337 
5338       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5339     }
5340 
5341   return true;
5342 }
5343 
5344 static enum elf_reloc_type_class
5345 elf64_alpha_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5346 			      const asection *rel_sec ATTRIBUTE_UNUSED,
5347 			      const Elf_Internal_Rela *rela)
5348 {
5349   switch ((int) ELF64_R_TYPE (rela->r_info))
5350     {
5351     case R_ALPHA_RELATIVE:
5352       return reloc_class_relative;
5353     case R_ALPHA_JMP_SLOT:
5354       return reloc_class_plt;
5355     case R_ALPHA_COPY:
5356       return reloc_class_copy;
5357     default:
5358       return reloc_class_normal;
5359     }
5360 }
5361 
5362 static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5363 {
5364   { STRING_COMMA_LEN (".sbss"),	 -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5365   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5366   { NULL,		      0,  0, 0,		   0 }
5367 };
5368 
5369 /* ECOFF swapping routines.  These are used when dealing with the
5370    .mdebug section, which is in the ECOFF debugging format.  Copied
5371    from elf32-mips.c.  */
5372 static const struct ecoff_debug_swap
5373 elf64_alpha_ecoff_debug_swap =
5374 {
5375   /* Symbol table magic number.  */
5376   magicSym2,
5377   /* Alignment of debugging information.  E.g., 4.  */
5378   8,
5379   /* Sizes of external symbolic information.  */
5380   sizeof (struct hdr_ext),
5381   sizeof (struct dnr_ext),
5382   sizeof (struct pdr_ext),
5383   sizeof (struct sym_ext),
5384   sizeof (struct opt_ext),
5385   sizeof (struct fdr_ext),
5386   sizeof (struct rfd_ext),
5387   sizeof (struct ext_ext),
5388   /* Functions to swap in external symbolic data.  */
5389   ecoff_swap_hdr_in,
5390   ecoff_swap_dnr_in,
5391   ecoff_swap_pdr_in,
5392   ecoff_swap_sym_in,
5393   ecoff_swap_opt_in,
5394   ecoff_swap_fdr_in,
5395   ecoff_swap_rfd_in,
5396   ecoff_swap_ext_in,
5397   _bfd_ecoff_swap_tir_in,
5398   _bfd_ecoff_swap_rndx_in,
5399   /* Functions to swap out external symbolic data.  */
5400   ecoff_swap_hdr_out,
5401   ecoff_swap_dnr_out,
5402   ecoff_swap_pdr_out,
5403   ecoff_swap_sym_out,
5404   ecoff_swap_opt_out,
5405   ecoff_swap_fdr_out,
5406   ecoff_swap_rfd_out,
5407   ecoff_swap_ext_out,
5408   _bfd_ecoff_swap_tir_out,
5409   _bfd_ecoff_swap_rndx_out,
5410   /* Function to read in symbolic data.  */
5411   elf64_alpha_read_ecoff_info
5412 };
5413 
5414 /* Use a non-standard hash bucket size of 8.  */
5415 
5416 static const struct elf_size_info alpha_elf_size_info =
5417 {
5418   sizeof (Elf64_External_Ehdr),
5419   sizeof (Elf64_External_Phdr),
5420   sizeof (Elf64_External_Shdr),
5421   sizeof (Elf64_External_Rel),
5422   sizeof (Elf64_External_Rela),
5423   sizeof (Elf64_External_Sym),
5424   sizeof (Elf64_External_Dyn),
5425   sizeof (Elf_External_Note),
5426   8,
5427   1,
5428   64, 3,
5429   ELFCLASS64, EV_CURRENT,
5430   bfd_elf64_write_out_phdrs,
5431   bfd_elf64_write_shdrs_and_ehdr,
5432   bfd_elf64_checksum_contents,
5433   bfd_elf64_write_relocs,
5434   bfd_elf64_swap_symbol_in,
5435   bfd_elf64_swap_symbol_out,
5436   bfd_elf64_slurp_reloc_table,
5437   bfd_elf64_slurp_symbol_table,
5438   bfd_elf64_swap_dyn_in,
5439   bfd_elf64_swap_dyn_out,
5440   bfd_elf64_swap_reloc_in,
5441   bfd_elf64_swap_reloc_out,
5442   bfd_elf64_swap_reloca_in,
5443   bfd_elf64_swap_reloca_out
5444 };
5445 
5446 #define TARGET_LITTLE_SYM	alpha_elf64_vec
5447 #define TARGET_LITTLE_NAME	"elf64-alpha"
5448 #define ELF_ARCH		bfd_arch_alpha
5449 #define ELF_TARGET_ID		ALPHA_ELF_DATA
5450 #define ELF_MACHINE_CODE	EM_ALPHA
5451 #define ELF_MAXPAGESIZE	0x10000
5452 #define ELF_COMMONPAGESIZE	0x2000
5453 
5454 #define bfd_elf64_bfd_link_hash_table_create \
5455   elf64_alpha_bfd_link_hash_table_create
5456 
5457 #define bfd_elf64_bfd_reloc_type_lookup \
5458   elf64_alpha_bfd_reloc_type_lookup
5459 #define bfd_elf64_bfd_reloc_name_lookup \
5460   elf64_alpha_bfd_reloc_name_lookup
5461 #define elf_info_to_howto \
5462   elf64_alpha_info_to_howto
5463 
5464 #define bfd_elf64_mkobject \
5465   elf64_alpha_mkobject
5466 #define elf_backend_object_p \
5467   elf64_alpha_object_p
5468 
5469 #define elf_backend_section_from_shdr \
5470   elf64_alpha_section_from_shdr
5471 #define elf_backend_section_flags \
5472   elf64_alpha_section_flags
5473 #define elf_backend_fake_sections \
5474   elf64_alpha_fake_sections
5475 
5476 #define bfd_elf64_bfd_is_local_label_name \
5477   elf64_alpha_is_local_label_name
5478 #define bfd_elf64_find_nearest_line \
5479   elf64_alpha_find_nearest_line
5480 #define bfd_elf64_bfd_relax_section \
5481   elf64_alpha_relax_section
5482 
5483 #define elf_backend_add_symbol_hook \
5484   elf64_alpha_add_symbol_hook
5485 #define elf_backend_relocs_compatible \
5486   _bfd_elf_relocs_compatible
5487 #define elf_backend_sort_relocs_p \
5488   elf64_alpha_sort_relocs_p
5489 #define elf_backend_check_relocs \
5490   elf64_alpha_check_relocs
5491 #define elf_backend_create_dynamic_sections \
5492   elf64_alpha_create_dynamic_sections
5493 #define elf_backend_adjust_dynamic_symbol \
5494   elf64_alpha_adjust_dynamic_symbol
5495 #define elf_backend_merge_symbol_attribute \
5496   elf64_alpha_merge_symbol_attribute
5497 #define elf_backend_copy_indirect_symbol \
5498   elf64_alpha_copy_indirect_symbol
5499 #define elf_backend_always_size_sections \
5500   elf64_alpha_always_size_sections
5501 #define elf_backend_size_dynamic_sections \
5502   elf64_alpha_size_dynamic_sections
5503 #define elf_backend_omit_section_dynsym \
5504   _bfd_elf_omit_section_dynsym_all
5505 #define elf_backend_relocate_section \
5506   elf64_alpha_relocate_section
5507 #define elf_backend_finish_dynamic_symbol \
5508   elf64_alpha_finish_dynamic_symbol
5509 #define elf_backend_finish_dynamic_sections \
5510   elf64_alpha_finish_dynamic_sections
5511 #define bfd_elf64_bfd_final_link \
5512   elf64_alpha_final_link
5513 #define elf_backend_reloc_type_class \
5514   elf64_alpha_reloc_type_class
5515 
5516 #define elf_backend_can_gc_sections	1
5517 #define elf_backend_gc_mark_hook	elf64_alpha_gc_mark_hook
5518 
5519 #define elf_backend_ecoff_debug_swap \
5520   &elf64_alpha_ecoff_debug_swap
5521 
5522 #define elf_backend_size_info \
5523   alpha_elf_size_info
5524 
5525 #define elf_backend_special_sections \
5526   elf64_alpha_special_sections
5527 
5528 #define elf_backend_strip_zero_sized_dynamic_sections \
5529   _bfd_elf_strip_zero_sized_dynamic_sections
5530 
5531 /* A few constants that determine how the .plt section is set up.  */
5532 #define elf_backend_want_got_plt 0
5533 #define elf_backend_plt_readonly 0
5534 #define elf_backend_want_plt_sym 1
5535 #define elf_backend_got_header_size 0
5536 #define elf_backend_dtrel_excludes_plt 1
5537 
5538 #include "elf64-target.h"
5539 
5540 /* FreeBSD support.  */
5541 
5542 #undef TARGET_LITTLE_SYM
5543 #define TARGET_LITTLE_SYM	alpha_elf64_fbsd_vec
5544 #undef TARGET_LITTLE_NAME
5545 #define TARGET_LITTLE_NAME	"elf64-alpha-freebsd"
5546 #undef	ELF_OSABI
5547 #define	ELF_OSABI		ELFOSABI_FREEBSD
5548 
5549 /* The kernel recognizes executables as valid only if they carry a
5550    "FreeBSD" label in the ELF header.  So we put this label on all
5551    executables and (for simplicity) also all other object files.  */
5552 
5553 static bool
5554 elf64_alpha_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
5555 {
5556   Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
5557 
5558   if (!_bfd_elf_init_file_header (abfd, info))
5559     return false;
5560 
5561   i_ehdrp = elf_elfheader (abfd);
5562 
5563   /* Put an ABI label supported by FreeBSD >= 4.1.  */
5564   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5565 #ifdef OLD_FREEBSD_ABI_LABEL
5566   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5567   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5568 #endif
5569   return true;
5570 }
5571 
5572 #undef elf_backend_init_file_header
5573 #define elf_backend_init_file_header \
5574   elf64_alpha_fbsd_init_file_header
5575 
5576 #undef  elf64_bed
5577 #define elf64_bed elf64_alpha_fbsd_bed
5578 
5579 #include "elf64-target.h"
5580