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