xref: /netbsd-src/external/gpl3/gdb/dist/bfd/elf64-alpha.c (revision dd255ccea4286b0c44fa8fd48a9a19a768afe8e1)
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
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 	  h->root.ref_regular = 1;
1816 	}
1817 
1818       /* We can only get preliminary data on whether a symbol is
1819          locally or externally defined, as not all of the input files
1820          have yet been processed.  Do something with what we know, as
1821          this may help reduce memory usage and processing time later.  */
1822       maybe_dynamic = FALSE;
1823       if (h && ((info->shared
1824 		 && (!info->symbolic
1825 		     || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1826 		|| !h->root.def_regular
1827 		|| h->root.root.type == bfd_link_hash_defweak))
1828         maybe_dynamic = TRUE;
1829 
1830       need = 0;
1831       gotent_flags = 0;
1832       r_type = ELF64_R_TYPE (rel->r_info);
1833       addend = rel->r_addend;
1834 
1835       switch (r_type)
1836 	{
1837 	case R_ALPHA_LITERAL:
1838 	  need = NEED_GOT | NEED_GOT_ENTRY;
1839 
1840 	  /* Remember how this literal is used from its LITUSEs.
1841 	     This will be important when it comes to decide if we can
1842 	     create a .plt entry for a function symbol.  */
1843 	  while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
1844 	    if (rel->r_addend >= 1 && rel->r_addend <= 6)
1845 	      gotent_flags |= 1 << rel->r_addend;
1846 	  --rel;
1847 
1848 	  /* No LITUSEs -- presumably the address is used somehow.  */
1849 	  if (gotent_flags == 0)
1850 	    gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
1851 	  break;
1852 
1853 	case R_ALPHA_GPDISP:
1854 	case R_ALPHA_GPREL16:
1855 	case R_ALPHA_GPREL32:
1856 	case R_ALPHA_GPRELHIGH:
1857 	case R_ALPHA_GPRELLOW:
1858 	case R_ALPHA_BRSGP:
1859 	  need = NEED_GOT;
1860 	  break;
1861 
1862 	case R_ALPHA_REFLONG:
1863 	case R_ALPHA_REFQUAD:
1864 	  if (info->shared || maybe_dynamic)
1865 	    need = NEED_DYNREL;
1866 	  break;
1867 
1868 	case R_ALPHA_TLSLDM:
1869 	  /* The symbol for a TLSLDM reloc is ignored.  Collapse the
1870 	     reloc to the STN_UNDEF (0) symbol so that they all match.  */
1871 	  r_symndx = STN_UNDEF;
1872 	  h = 0;
1873 	  maybe_dynamic = FALSE;
1874 	  /* FALLTHRU */
1875 
1876 	case R_ALPHA_TLSGD:
1877 	case R_ALPHA_GOTDTPREL:
1878 	  need = NEED_GOT | NEED_GOT_ENTRY;
1879 	  break;
1880 
1881 	case R_ALPHA_GOTTPREL:
1882 	  need = NEED_GOT | NEED_GOT_ENTRY;
1883 	  gotent_flags = ALPHA_ELF_LINK_HASH_TLS_IE;
1884 	  if (info->shared)
1885 	    info->flags |= DF_STATIC_TLS;
1886 	  break;
1887 
1888 	case R_ALPHA_TPREL64:
1889 	  if (info->shared && !info->pie)
1890 	    {
1891 	      info->flags |= DF_STATIC_TLS;
1892 	      need = NEED_DYNREL;
1893 	    }
1894 	  else if (maybe_dynamic)
1895 	    need = NEED_DYNREL;
1896 	  break;
1897 	}
1898 
1899       if (need & NEED_GOT)
1900 	{
1901 	  if (alpha_elf_tdata(abfd)->gotobj == NULL)
1902 	    {
1903 	      if (!elf64_alpha_create_got_section (abfd, info))
1904 		return FALSE;
1905 	    }
1906 	}
1907 
1908       if (need & NEED_GOT_ENTRY)
1909 	{
1910 	  struct alpha_elf_got_entry *gotent;
1911 
1912 	  gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
1913 	  if (!gotent)
1914 	    return FALSE;
1915 
1916 	  if (gotent_flags)
1917 	    {
1918 	      gotent->flags |= gotent_flags;
1919 	      if (h)
1920 		{
1921 		  gotent_flags |= h->flags;
1922 		  h->flags = gotent_flags;
1923 
1924 		  /* Make a guess as to whether a .plt entry is needed.  */
1925 		  /* ??? It appears that we won't make it into
1926 		     adjust_dynamic_symbol for symbols that remain
1927 		     totally undefined.  Copying this check here means
1928 		     we can create a plt entry for them too.  */
1929 		  h->root.needs_plt
1930 		    = (maybe_dynamic && elf64_alpha_want_plt (h));
1931 		}
1932 	    }
1933 	}
1934 
1935       if (need & NEED_DYNREL)
1936 	{
1937 	  /* We need to create the section here now whether we eventually
1938 	     use it or not so that it gets mapped to an output section by
1939 	     the linker.  If not used, we'll kill it in size_dynamic_sections.  */
1940 	  if (sreloc == NULL)
1941 	    {
1942 	      sreloc = _bfd_elf_make_dynamic_reloc_section
1943 		(sec, dynobj, 3, abfd, /*rela?*/ TRUE);
1944 
1945 	      if (sreloc == NULL)
1946 		return FALSE;
1947 	    }
1948 
1949 	  if (h)
1950 	    {
1951 	      /* Since we havn't seen all of the input symbols yet, we
1952 		 don't know whether we'll actually need a dynamic relocation
1953 		 entry for this reloc.  So make a record of it.  Once we
1954 		 find out if this thing needs dynamic relocation we'll
1955 		 expand the relocation sections by the appropriate amount.  */
1956 
1957 	      struct alpha_elf_reloc_entry *rent;
1958 
1959 	      for (rent = h->reloc_entries; rent; rent = rent->next)
1960 		if (rent->rtype == r_type && rent->srel == sreloc)
1961 		  break;
1962 
1963 	      if (!rent)
1964 		{
1965 		  amt = sizeof (struct alpha_elf_reloc_entry);
1966 		  rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
1967 		  if (!rent)
1968 		    return FALSE;
1969 
1970 		  rent->srel = sreloc;
1971 		  rent->rtype = r_type;
1972 		  rent->count = 1;
1973 		  rent->reltext = (sec->flags & SEC_READONLY) != 0;
1974 
1975 		  rent->next = h->reloc_entries;
1976 		  h->reloc_entries = rent;
1977 		}
1978 	      else
1979 		rent->count++;
1980 	    }
1981 	  else if (info->shared)
1982 	    {
1983 	      /* If this is a shared library, and the section is to be
1984 		 loaded into memory, we need a RELATIVE reloc.  */
1985 	      sreloc->size += sizeof (Elf64_External_Rela);
1986 	      if (sec->flags & SEC_READONLY)
1987 		info->flags |= DF_TEXTREL;
1988 	    }
1989 	}
1990     }
1991 
1992   return TRUE;
1993 }
1994 
1995 /* Return the section that should be marked against GC for a given
1996    relocation.  */
1997 
1998 static asection *
1999 elf64_alpha_gc_mark_hook (asection *sec, struct bfd_link_info *info,
2000 			  Elf_Internal_Rela *rel,
2001 			  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
2002 {
2003   /* These relocations don't really reference a symbol.  Instead we store
2004      extra data in their addend slot.  Ignore the symbol.  */
2005   switch (ELF64_R_TYPE (rel->r_info))
2006     {
2007     case R_ALPHA_LITUSE:
2008     case R_ALPHA_GPDISP:
2009     case R_ALPHA_HINT:
2010       return NULL;
2011     }
2012 
2013   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2014 }
2015 
2016 /* Update the got entry reference counts for the section being removed.  */
2017 
2018 static bfd_boolean
2019 elf64_alpha_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
2020 			   asection *sec, const Elf_Internal_Rela *relocs)
2021 {
2022   Elf_Internal_Shdr *symtab_hdr;
2023   struct alpha_elf_link_hash_entry **sym_hashes;
2024   const Elf_Internal_Rela *rel, *relend;
2025 
2026   if (info->relocatable)
2027     return TRUE;
2028 
2029   symtab_hdr = &elf_symtab_hdr (abfd);
2030   sym_hashes = alpha_elf_sym_hashes (abfd);
2031 
2032   relend = relocs + sec->reloc_count;
2033   for (rel = relocs; rel < relend; rel++)
2034     {
2035       unsigned long r_symndx, r_type;
2036       struct alpha_elf_link_hash_entry *h = NULL;
2037       struct alpha_elf_got_entry *gotent;
2038 
2039       r_symndx = ELF64_R_SYM (rel->r_info);
2040       if (r_symndx >= symtab_hdr->sh_info)
2041 	{
2042 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2043 	  while (h->root.root.type == bfd_link_hash_indirect
2044 		 || h->root.root.type == bfd_link_hash_warning)
2045 	    h = (struct alpha_elf_link_hash_entry *) h->root.root.u.i.link;
2046 	}
2047 
2048       r_type = ELF64_R_TYPE (rel->r_info);
2049       switch (r_type)
2050 	{
2051 	case R_ALPHA_LITERAL:
2052 	  /* ??? Ignore re-computation of gotent_flags.  We're not
2053 	     carrying a use-count for each bit in that mask.  */
2054 
2055 	case R_ALPHA_TLSGD:
2056 	case R_ALPHA_GOTDTPREL:
2057 	case R_ALPHA_GOTTPREL:
2058 	  /* Fetch the got entry from the tables.  */
2059 	  gotent = get_got_entry (abfd, h, r_type, r_symndx, rel->r_addend);
2060 
2061 	  /* The got entry *must* exist, since we should have created it
2062 	     before during check_relocs.  Also note that get_got_entry
2063 	     assumed this was going to be another use, and so incremented
2064 	     the use count again.  Thus the use count must be at least the
2065 	     one real use and the "use" we just added.  */
2066 	  if (gotent == NULL || gotent->use_count < 2)
2067 	    {
2068 	      abort ();
2069 	      return FALSE;
2070 	    }
2071 	  gotent->use_count -= 2;
2072 	  break;
2073 
2074 	default:
2075 	  break;
2076 	}
2077     }
2078 
2079   return TRUE;
2080 }
2081 
2082 /* Adjust a symbol defined by a dynamic object and referenced by a
2083    regular object.  The current definition is in some section of the
2084    dynamic object, but we're not including those sections.  We have to
2085    change the definition to something the rest of the link can
2086    understand.  */
2087 
2088 static bfd_boolean
2089 elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info *info,
2090 				   struct elf_link_hash_entry *h)
2091 {
2092   bfd *dynobj;
2093   asection *s;
2094   struct alpha_elf_link_hash_entry *ah;
2095 
2096   dynobj = elf_hash_table(info)->dynobj;
2097   ah = (struct alpha_elf_link_hash_entry *)h;
2098 
2099   /* Now that we've seen all of the input symbols, finalize our decision
2100      about whether this symbol should get a .plt entry.  Irritatingly, it
2101      is common for folk to leave undefined symbols in shared libraries,
2102      and they still expect lazy binding; accept undefined symbols in lieu
2103      of STT_FUNC.  */
2104   if (alpha_elf_dynamic_symbol_p (h, info) && elf64_alpha_want_plt (ah))
2105     {
2106       h->needs_plt = TRUE;
2107 
2108       s = bfd_get_linker_section (dynobj, ".plt");
2109       if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2110 	return FALSE;
2111 
2112       /* We need one plt entry per got subsection.  Delay allocation of
2113 	 the actual plt entries until size_plt_section, called from
2114 	 size_dynamic_sections or during relaxation.  */
2115 
2116       return TRUE;
2117     }
2118   else
2119     h->needs_plt = FALSE;
2120 
2121   /* If this is a weak symbol, and there is a real definition, the
2122      processor independent code will have arranged for us to see the
2123      real definition first, and we can just use the same value.  */
2124   if (h->u.weakdef != NULL)
2125     {
2126       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2127 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2128       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2129       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2130       return TRUE;
2131     }
2132 
2133   /* This is a reference to a symbol defined by a dynamic object which
2134      is not a function.  The Alpha, since it uses .got entries for all
2135      symbols even in regular objects, does not need the hackery of a
2136      .dynbss section and COPY dynamic relocations.  */
2137 
2138   return TRUE;
2139 }
2140 
2141 /* Record STO_ALPHA_NOPV and STO_ALPHA_STD_GPLOAD.  */
2142 
2143 static void
2144 elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
2145 				    const Elf_Internal_Sym *isym,
2146 				    bfd_boolean definition,
2147 				    bfd_boolean dynamic)
2148 {
2149   if (!dynamic && definition)
2150     h->other = ((h->other & ELF_ST_VISIBILITY (-1))
2151 		| (isym->st_other & ~ELF_ST_VISIBILITY (-1)));
2152 }
2153 
2154 /* Symbol versioning can create new symbols, and make our old symbols
2155    indirect to the new ones.  Consolidate the got and reloc information
2156    in these situations.  */
2157 
2158 static void
2159 elf64_alpha_copy_indirect_symbol (struct bfd_link_info *info,
2160 				  struct elf_link_hash_entry *dir,
2161 				  struct elf_link_hash_entry *ind)
2162 {
2163   struct alpha_elf_link_hash_entry *hi
2164     = (struct alpha_elf_link_hash_entry *) ind;
2165   struct alpha_elf_link_hash_entry *hs
2166     = (struct alpha_elf_link_hash_entry *) dir;
2167 
2168   /* Do the merging in the superclass.  */
2169   _bfd_elf_link_hash_copy_indirect(info, dir, ind);
2170 
2171   /* Merge the flags.  Whee.  */
2172   hs->flags |= hi->flags;
2173 
2174   /* ??? It's unclear to me what's really supposed to happen when
2175      "merging" defweak and defined symbols, given that we don't
2176      actually throw away the defweak.  This more-or-less copies
2177      the logic related to got and plt entries in the superclass.  */
2178   if (ind->root.type != bfd_link_hash_indirect)
2179     return;
2180 
2181   /* Merge the .got entries.  Cannibalize the old symbol's list in
2182      doing so, since we don't need it anymore.  */
2183 
2184   if (hs->got_entries == NULL)
2185     hs->got_entries = hi->got_entries;
2186   else
2187     {
2188       struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2189 
2190       gsh = hs->got_entries;
2191       for (gi = hi->got_entries; gi ; gi = gin)
2192 	{
2193 	  gin = gi->next;
2194 	  for (gs = gsh; gs ; gs = gs->next)
2195 	    if (gi->gotobj == gs->gotobj
2196 		&& gi->reloc_type == gs->reloc_type
2197 		&& gi->addend == gs->addend)
2198 	      {
2199 		gi->use_count += gs->use_count;
2200 	        goto got_found;
2201 	      }
2202 	  gi->next = hs->got_entries;
2203 	  hs->got_entries = gi;
2204 	got_found:;
2205 	}
2206     }
2207   hi->got_entries = NULL;
2208 
2209   /* And similar for the reloc entries.  */
2210 
2211   if (hs->reloc_entries == NULL)
2212     hs->reloc_entries = hi->reloc_entries;
2213   else
2214     {
2215       struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2216 
2217       rsh = hs->reloc_entries;
2218       for (ri = hi->reloc_entries; ri ; ri = rin)
2219 	{
2220 	  rin = ri->next;
2221 	  for (rs = rsh; rs ; rs = rs->next)
2222 	    if (ri->rtype == rs->rtype && ri->srel == rs->srel)
2223 	      {
2224 		rs->count += ri->count;
2225 		goto found_reloc;
2226 	      }
2227 	  ri->next = hs->reloc_entries;
2228 	  hs->reloc_entries = ri;
2229 	found_reloc:;
2230 	}
2231     }
2232   hi->reloc_entries = NULL;
2233 }
2234 
2235 /* Is it possible to merge two object file's .got tables?  */
2236 
2237 static bfd_boolean
2238 elf64_alpha_can_merge_gots (bfd *a, bfd *b)
2239 {
2240   int total = alpha_elf_tdata (a)->total_got_size;
2241   bfd *bsub;
2242 
2243   /* Trivial quick fallout test.  */
2244   if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2245     return TRUE;
2246 
2247   /* By their nature, local .got entries cannot be merged.  */
2248   if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
2249     return FALSE;
2250 
2251   /* Failing the common trivial comparison, we must effectively
2252      perform the merge.  Not actually performing the merge means that
2253      we don't have to store undo information in case we fail.  */
2254   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2255     {
2256       struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2257       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2258       int i, n;
2259 
2260       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2261       for (i = 0; i < n; ++i)
2262 	{
2263 	  struct alpha_elf_got_entry *ae, *be;
2264 	  struct alpha_elf_link_hash_entry *h;
2265 
2266 	  h = hashes[i];
2267 	  while (h->root.root.type == bfd_link_hash_indirect
2268 	         || h->root.root.type == bfd_link_hash_warning)
2269 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2270 
2271 	  for (be = h->got_entries; be ; be = be->next)
2272 	    {
2273 	      if (be->use_count == 0)
2274 	        continue;
2275 	      if (be->gotobj != b)
2276 	        continue;
2277 
2278 	      for (ae = h->got_entries; ae ; ae = ae->next)
2279 	        if (ae->gotobj == a
2280 		    && ae->reloc_type == be->reloc_type
2281 		    && ae->addend == be->addend)
2282 		  goto global_found;
2283 
2284 	      total += alpha_got_entry_size (be->reloc_type);
2285 	      if (total > MAX_GOT_SIZE)
2286 	        return FALSE;
2287 	    global_found:;
2288 	    }
2289 	}
2290     }
2291 
2292   return TRUE;
2293 }
2294 
2295 /* Actually merge two .got tables.  */
2296 
2297 static void
2298 elf64_alpha_merge_gots (bfd *a, bfd *b)
2299 {
2300   int total = alpha_elf_tdata (a)->total_got_size;
2301   bfd *bsub;
2302 
2303   /* Remember local expansion.  */
2304   {
2305     int e = alpha_elf_tdata (b)->local_got_size;
2306     total += e;
2307     alpha_elf_tdata (a)->local_got_size += e;
2308   }
2309 
2310   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2311     {
2312       struct alpha_elf_got_entry **local_got_entries;
2313       struct alpha_elf_link_hash_entry **hashes;
2314       Elf_Internal_Shdr *symtab_hdr;
2315       int i, n;
2316 
2317       /* Let the local .got entries know they are part of a new subsegment.  */
2318       local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2319       if (local_got_entries)
2320         {
2321 	  n = elf_tdata (bsub)->symtab_hdr.sh_info;
2322 	  for (i = 0; i < n; ++i)
2323 	    {
2324 	      struct alpha_elf_got_entry *ent;
2325 	      for (ent = local_got_entries[i]; ent; ent = ent->next)
2326 	        ent->gotobj = a;
2327 	    }
2328         }
2329 
2330       /* Merge the global .got entries.  */
2331       hashes = alpha_elf_sym_hashes (bsub);
2332       symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2333 
2334       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2335       for (i = 0; i < n; ++i)
2336         {
2337 	  struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2338 	  struct alpha_elf_link_hash_entry *h;
2339 
2340 	  h = hashes[i];
2341 	  while (h->root.root.type == bfd_link_hash_indirect
2342 	         || h->root.root.type == bfd_link_hash_warning)
2343 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2344 
2345 	  pbe = start = &h->got_entries;
2346 	  while ((be = *pbe) != NULL)
2347 	    {
2348 	      if (be->use_count == 0)
2349 	        {
2350 		  *pbe = be->next;
2351 		  memset (be, 0xa5, sizeof (*be));
2352 		  goto kill;
2353 	        }
2354 	      if (be->gotobj != b)
2355 	        goto next;
2356 
2357 	      for (ae = *start; ae ; ae = ae->next)
2358 	        if (ae->gotobj == a
2359 		    && ae->reloc_type == be->reloc_type
2360 		    && ae->addend == be->addend)
2361 		  {
2362 		    ae->flags |= be->flags;
2363 		    ae->use_count += be->use_count;
2364 		    *pbe = be->next;
2365 		    memset (be, 0xa5, sizeof (*be));
2366 		    goto kill;
2367 		  }
2368 	      be->gotobj = a;
2369 	      total += alpha_got_entry_size (be->reloc_type);
2370 
2371 	    next:;
2372 	      pbe = &be->next;
2373 	    kill:;
2374 	    }
2375         }
2376 
2377       alpha_elf_tdata (bsub)->gotobj = a;
2378     }
2379   alpha_elf_tdata (a)->total_got_size = total;
2380 
2381   /* Merge the two in_got chains.  */
2382   {
2383     bfd *next;
2384 
2385     bsub = a;
2386     while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2387       bsub = next;
2388 
2389     alpha_elf_tdata (bsub)->in_got_link_next = b;
2390   }
2391 }
2392 
2393 /* Calculate the offsets for the got entries.  */
2394 
2395 static bfd_boolean
2396 elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry *h,
2397 					 void * arg ATTRIBUTE_UNUSED)
2398 {
2399   struct alpha_elf_got_entry *gotent;
2400 
2401   for (gotent = h->got_entries; gotent; gotent = gotent->next)
2402     if (gotent->use_count > 0)
2403       {
2404 	struct alpha_elf_obj_tdata *td;
2405 	bfd_size_type *plge;
2406 
2407 	td = alpha_elf_tdata (gotent->gotobj);
2408 	plge = &td->got->size;
2409 	gotent->got_offset = *plge;
2410 	*plge += alpha_got_entry_size (gotent->reloc_type);
2411       }
2412 
2413   return TRUE;
2414 }
2415 
2416 static void
2417 elf64_alpha_calc_got_offsets (struct bfd_link_info *info)
2418 {
2419   bfd *i, *got_list;
2420   struct alpha_elf_link_hash_table * htab;
2421 
2422   htab = alpha_elf_hash_table (info);
2423   if (htab == NULL)
2424     return;
2425   got_list = htab->got_list;
2426 
2427   /* First, zero out the .got sizes, as we may be recalculating the
2428      .got after optimizing it.  */
2429   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2430     alpha_elf_tdata(i)->got->size = 0;
2431 
2432   /* Next, fill in the offsets for all the global entries.  */
2433   alpha_elf_link_hash_traverse (htab,
2434 				elf64_alpha_calc_got_offsets_for_symbol,
2435 				NULL);
2436 
2437   /* Finally, fill in the offsets for the local entries.  */
2438   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2439     {
2440       bfd_size_type got_offset = alpha_elf_tdata(i)->got->size;
2441       bfd *j;
2442 
2443       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2444 	{
2445 	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2446 	  int k, n;
2447 
2448 	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2449 	  if (!local_got_entries)
2450 	    continue;
2451 
2452 	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2453 	    for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2454 	      if (gotent->use_count > 0)
2455 	        {
2456 		  gotent->got_offset = got_offset;
2457 		  got_offset += alpha_got_entry_size (gotent->reloc_type);
2458 	        }
2459 	}
2460 
2461       alpha_elf_tdata(i)->got->size = got_offset;
2462     }
2463 }
2464 
2465 /* Constructs the gots.  */
2466 
2467 static bfd_boolean
2468 elf64_alpha_size_got_sections (struct bfd_link_info *info)
2469 {
2470   bfd *i, *got_list, *cur_got_obj = NULL;
2471   struct alpha_elf_link_hash_table * htab;
2472 
2473   htab = alpha_elf_hash_table (info);
2474   if (htab == NULL)
2475     return FALSE;
2476   got_list = htab->got_list;
2477 
2478   /* On the first time through, pretend we have an existing got list
2479      consisting of all of the input files.  */
2480   if (got_list == NULL)
2481     {
2482       for (i = info->input_bfds; i ; i = i->link_next)
2483 	{
2484 	  bfd *this_got;
2485 
2486 	  if (! is_alpha_elf (i))
2487 	    continue;
2488 
2489 	  this_got = alpha_elf_tdata (i)->gotobj;
2490 	  if (this_got == NULL)
2491 	    continue;
2492 
2493 	  /* We are assuming no merging has yet occurred.  */
2494 	  BFD_ASSERT (this_got == i);
2495 
2496           if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
2497 	    {
2498 	      /* Yikes! A single object file has too many entries.  */
2499 	      (*_bfd_error_handler)
2500 	        (_("%B: .got subsegment exceeds 64K (size %d)"),
2501 	         i, alpha_elf_tdata (this_got)->total_got_size);
2502 	      return FALSE;
2503 	    }
2504 
2505 	  if (got_list == NULL)
2506 	    got_list = this_got;
2507 	  else
2508 	    alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
2509 	  cur_got_obj = this_got;
2510 	}
2511 
2512       /* Strange degenerate case of no got references.  */
2513       if (got_list == NULL)
2514 	return TRUE;
2515 
2516       htab->got_list = got_list;
2517     }
2518 
2519   cur_got_obj = got_list;
2520   if (cur_got_obj == NULL)
2521     return FALSE;
2522 
2523   i = alpha_elf_tdata(cur_got_obj)->got_link_next;
2524   while (i != NULL)
2525     {
2526       if (elf64_alpha_can_merge_gots (cur_got_obj, i))
2527 	{
2528 	  elf64_alpha_merge_gots (cur_got_obj, i);
2529 
2530 	  alpha_elf_tdata(i)->got->size = 0;
2531 	  i = alpha_elf_tdata(i)->got_link_next;
2532 	  alpha_elf_tdata(cur_got_obj)->got_link_next = i;
2533 	}
2534       else
2535 	{
2536 	  cur_got_obj = i;
2537 	  i = alpha_elf_tdata(i)->got_link_next;
2538 	}
2539     }
2540 
2541   /* Once the gots have been merged, fill in the got offsets for
2542      everything therein.  */
2543   elf64_alpha_calc_got_offsets (info);
2544 
2545   return TRUE;
2546 }
2547 
2548 static bfd_boolean
2549 elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry *h,
2550 				void * data)
2551 {
2552   asection *splt = (asection *) data;
2553   struct alpha_elf_got_entry *gotent;
2554   bfd_boolean saw_one = FALSE;
2555 
2556   /* If we didn't need an entry before, we still don't.  */
2557   if (!h->root.needs_plt)
2558     return TRUE;
2559 
2560   /* For each LITERAL got entry still in use, allocate a plt entry.  */
2561   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2562     if (gotent->reloc_type == R_ALPHA_LITERAL
2563 	&& gotent->use_count > 0)
2564       {
2565 	if (splt->size == 0)
2566 	  splt->size = PLT_HEADER_SIZE;
2567 	gotent->plt_offset = splt->size;
2568 	splt->size += PLT_ENTRY_SIZE;
2569 	saw_one = TRUE;
2570       }
2571 
2572   /* If there weren't any, there's no longer a need for the PLT entry.  */
2573   if (!saw_one)
2574     h->root.needs_plt = FALSE;
2575 
2576   return TRUE;
2577 }
2578 
2579 /* Called from relax_section to rebuild the PLT in light of potential changes
2580    in the function's status.  */
2581 
2582 static void
2583 elf64_alpha_size_plt_section (struct bfd_link_info *info)
2584 {
2585   asection *splt, *spltrel, *sgotplt;
2586   unsigned long entries;
2587   bfd *dynobj;
2588   struct alpha_elf_link_hash_table * htab;
2589 
2590   htab = alpha_elf_hash_table (info);
2591   if (htab == NULL)
2592     return;
2593 
2594   dynobj = elf_hash_table(info)->dynobj;
2595   splt = bfd_get_linker_section (dynobj, ".plt");
2596   if (splt == NULL)
2597     return;
2598 
2599   splt->size = 0;
2600 
2601   alpha_elf_link_hash_traverse (htab,
2602 				elf64_alpha_size_plt_section_1, splt);
2603 
2604   /* Every plt entry requires a JMP_SLOT relocation.  */
2605   spltrel = bfd_get_linker_section (dynobj, ".rela.plt");
2606   entries = 0;
2607   if (splt->size)
2608     {
2609       if (elf64_alpha_use_secureplt)
2610 	entries = (splt->size - NEW_PLT_HEADER_SIZE) / NEW_PLT_ENTRY_SIZE;
2611       else
2612 	entries = (splt->size - OLD_PLT_HEADER_SIZE) / OLD_PLT_ENTRY_SIZE;
2613     }
2614   spltrel->size = entries * sizeof (Elf64_External_Rela);
2615 
2616   /* When using the secureplt, we need two words somewhere in the data
2617      segment for the dynamic linker to tell us where to go.  This is the
2618      entire contents of the .got.plt section.  */
2619   if (elf64_alpha_use_secureplt)
2620     {
2621       sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
2622       sgotplt->size = entries ? 16 : 0;
2623     }
2624 }
2625 
2626 static bfd_boolean
2627 elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2628 				  struct bfd_link_info *info)
2629 {
2630   bfd *i;
2631   struct alpha_elf_link_hash_table * htab;
2632 
2633   if (info->relocatable)
2634     return TRUE;
2635 
2636   htab = alpha_elf_hash_table (info);
2637   if (htab == NULL)
2638     return FALSE;
2639 
2640   if (!elf64_alpha_size_got_sections (info))
2641     return FALSE;
2642 
2643   /* Allocate space for all of the .got subsections.  */
2644   i = htab->got_list;
2645   for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
2646     {
2647       asection *s = alpha_elf_tdata(i)->got;
2648       if (s->size > 0)
2649 	{
2650 	  s->contents = (bfd_byte *) bfd_zalloc (i, s->size);
2651 	  if (s->contents == NULL)
2652 	    return FALSE;
2653 	}
2654     }
2655 
2656   return TRUE;
2657 }
2658 
2659 /* The number of dynamic relocations required by a static relocation.  */
2660 
2661 static int
2662 alpha_dynamic_entries_for_reloc (int r_type, int dynamic, int shared, int pie)
2663 {
2664   switch (r_type)
2665     {
2666     /* May appear in GOT entries.  */
2667     case R_ALPHA_TLSGD:
2668       return (dynamic ? 2 : shared ? 1 : 0);
2669     case R_ALPHA_TLSLDM:
2670       return shared;
2671     case R_ALPHA_LITERAL:
2672       return dynamic || shared;
2673     case R_ALPHA_GOTTPREL:
2674       return dynamic || (shared && !pie);
2675     case R_ALPHA_GOTDTPREL:
2676       return dynamic;
2677 
2678     /* May appear in data sections.  */
2679     case R_ALPHA_REFLONG:
2680     case R_ALPHA_REFQUAD:
2681       return dynamic || shared;
2682     case R_ALPHA_TPREL64:
2683       return dynamic || (shared && !pie);
2684 
2685     /* Everything else is illegal.  We'll issue an error during
2686        relocate_section.  */
2687     default:
2688       return 0;
2689     }
2690 }
2691 
2692 /* Work out the sizes of the dynamic relocation entries.  */
2693 
2694 static bfd_boolean
2695 elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
2696 			       struct bfd_link_info *info)
2697 {
2698   bfd_boolean dynamic;
2699   struct alpha_elf_reloc_entry *relent;
2700   unsigned long entries;
2701 
2702   /* If the symbol was defined as a common symbol in a regular object
2703      file, and there was no definition in any dynamic object, then the
2704      linker will have allocated space for the symbol in a common
2705      section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2706      set.  This is done for dynamic symbols in
2707      elf_adjust_dynamic_symbol but this is not done for non-dynamic
2708      symbols, somehow.  */
2709   if (!h->root.def_regular
2710       && h->root.ref_regular
2711       && !h->root.def_dynamic
2712       && (h->root.root.type == bfd_link_hash_defined
2713 	  || h->root.root.type == bfd_link_hash_defweak)
2714       && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
2715     h->root.def_regular = 1;
2716 
2717   /* If the symbol is dynamic, we'll need all the relocations in their
2718      natural form.  If this is a shared object, and it has been forced
2719      local, we'll need the same number of RELATIVE relocations.  */
2720   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2721 
2722   /* If the symbol is a hidden undefined weak, then we never have any
2723      relocations.  Avoid the loop which may want to add RELATIVE relocs
2724      based on info->shared.  */
2725   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2726     return TRUE;
2727 
2728   for (relent = h->reloc_entries; relent; relent = relent->next)
2729     {
2730       entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
2731 						 info->shared, info->pie);
2732       if (entries)
2733 	{
2734 	  relent->srel->size +=
2735 	    entries * sizeof (Elf64_External_Rela) * relent->count;
2736 	  if (relent->reltext)
2737 	    info->flags |= DT_TEXTREL;
2738 	}
2739     }
2740 
2741   return TRUE;
2742 }
2743 
2744 /* Subroutine of elf64_alpha_size_rela_got_section for doing the
2745    global symbols.  */
2746 
2747 static bfd_boolean
2748 elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry *h,
2749 			     struct bfd_link_info *info)
2750 {
2751   bfd_boolean dynamic;
2752   struct alpha_elf_got_entry *gotent;
2753   unsigned long entries;
2754 
2755   /* If we're using a plt for this symbol, then all of its relocations
2756      for its got entries go into .rela.plt.  */
2757   if (h->root.needs_plt)
2758     return TRUE;
2759 
2760   /* If the symbol is dynamic, we'll need all the relocations in their
2761      natural form.  If this is a shared object, and it has been forced
2762      local, we'll need the same number of RELATIVE relocations.  */
2763   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2764 
2765   /* If the symbol is a hidden undefined weak, then we never have any
2766      relocations.  Avoid the loop which may want to add RELATIVE relocs
2767      based on info->shared.  */
2768   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2769     return TRUE;
2770 
2771   entries = 0;
2772   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2773     if (gotent->use_count > 0)
2774       entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type, dynamic,
2775 						  info->shared, info->pie);
2776 
2777   if (entries > 0)
2778     {
2779       bfd *dynobj = elf_hash_table(info)->dynobj;
2780       asection *srel = bfd_get_linker_section (dynobj, ".rela.got");
2781       BFD_ASSERT (srel != NULL);
2782       srel->size += sizeof (Elf64_External_Rela) * entries;
2783     }
2784 
2785   return TRUE;
2786 }
2787 
2788 /* Set the sizes of the dynamic relocation sections.  */
2789 
2790 static void
2791 elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
2792 {
2793   unsigned long entries;
2794   bfd *i, *dynobj;
2795   asection *srel;
2796   struct alpha_elf_link_hash_table * htab;
2797 
2798   htab = alpha_elf_hash_table (info);
2799   if (htab == NULL)
2800     return;
2801 
2802   /* Shared libraries often require RELATIVE relocs, and some relocs
2803      require attention for the main application as well.  */
2804 
2805   entries = 0;
2806   for (i = htab->got_list;
2807        i ; i = alpha_elf_tdata(i)->got_link_next)
2808     {
2809       bfd *j;
2810 
2811       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2812 	{
2813 	  struct alpha_elf_got_entry **local_got_entries, *gotent;
2814 	  int k, n;
2815 
2816 	  local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2817 	  if (!local_got_entries)
2818 	    continue;
2819 
2820 	  for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2821 	    for (gotent = local_got_entries[k];
2822 		 gotent ; gotent = gotent->next)
2823 	      if (gotent->use_count > 0)
2824 		entries += (alpha_dynamic_entries_for_reloc
2825 			    (gotent->reloc_type, 0, info->shared, info->pie));
2826 	}
2827     }
2828 
2829   dynobj = elf_hash_table(info)->dynobj;
2830   srel = bfd_get_linker_section (dynobj, ".rela.got");
2831   if (!srel)
2832     {
2833       BFD_ASSERT (entries == 0);
2834       return;
2835     }
2836   srel->size = sizeof (Elf64_External_Rela) * entries;
2837 
2838   /* Now do the non-local symbols.  */
2839   alpha_elf_link_hash_traverse (htab,
2840 				elf64_alpha_size_rela_got_1, info);
2841 }
2842 
2843 /* Set the sizes of the dynamic sections.  */
2844 
2845 static bfd_boolean
2846 elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2847 				   struct bfd_link_info *info)
2848 {
2849   bfd *dynobj;
2850   asection *s;
2851   bfd_boolean relplt;
2852   struct alpha_elf_link_hash_table * htab;
2853 
2854   htab = alpha_elf_hash_table (info);
2855   if (htab == NULL)
2856     return FALSE;
2857 
2858   dynobj = elf_hash_table(info)->dynobj;
2859   BFD_ASSERT(dynobj != NULL);
2860 
2861   if (elf_hash_table (info)->dynamic_sections_created)
2862     {
2863       /* Set the contents of the .interp section to the interpreter.  */
2864       if (info->executable)
2865 	{
2866 	  s = bfd_get_linker_section (dynobj, ".interp");
2867 	  BFD_ASSERT (s != NULL);
2868 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2869 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2870 	}
2871 
2872       /* Now that we've seen all of the input files, we can decide which
2873 	 symbols need dynamic relocation entries and which don't.  We've
2874 	 collected information in check_relocs that we can now apply to
2875 	 size the dynamic relocation sections.  */
2876       alpha_elf_link_hash_traverse (htab,
2877 				    elf64_alpha_calc_dynrel_sizes, info);
2878 
2879       elf64_alpha_size_rela_got_section (info);
2880       elf64_alpha_size_plt_section (info);
2881     }
2882   /* else we're not dynamic and by definition we don't need such things.  */
2883 
2884   /* The check_relocs and adjust_dynamic_symbol entry points have
2885      determined the sizes of the various dynamic sections.  Allocate
2886      memory for them.  */
2887   relplt = FALSE;
2888   for (s = dynobj->sections; s != NULL; s = s->next)
2889     {
2890       const char *name;
2891 
2892       if (!(s->flags & SEC_LINKER_CREATED))
2893 	continue;
2894 
2895       /* It's OK to base decisions on the section name, because none
2896 	 of the dynobj section names depend upon the input files.  */
2897       name = bfd_get_section_name (dynobj, s);
2898 
2899       if (CONST_STRNEQ (name, ".rela"))
2900 	{
2901 	  if (s->size != 0)
2902 	    {
2903 	      if (strcmp (name, ".rela.plt") == 0)
2904 		relplt = TRUE;
2905 
2906 	      /* We use the reloc_count field as a counter if we need
2907 		 to copy relocs into the output file.  */
2908 	      s->reloc_count = 0;
2909 	    }
2910 	}
2911       else if (! CONST_STRNEQ (name, ".got")
2912 	       && strcmp (name, ".plt") != 0
2913 	       && strcmp (name, ".dynbss") != 0)
2914 	{
2915 	  /* It's not one of our dynamic sections, so don't allocate space.  */
2916 	  continue;
2917 	}
2918 
2919       if (s->size == 0)
2920 	{
2921 	  /* If we don't need this section, strip it from the output file.
2922 	     This is to handle .rela.bss and .rela.plt.  We must create it
2923 	     in create_dynamic_sections, because it must be created before
2924 	     the linker maps input sections to output sections.  The
2925 	     linker does that before adjust_dynamic_symbol is called, and
2926 	     it is that function which decides whether anything needs to
2927 	     go into these sections.  */
2928 	  if (!CONST_STRNEQ (name, ".got"))
2929 	    s->flags |= SEC_EXCLUDE;
2930 	}
2931       else if ((s->flags & SEC_HAS_CONTENTS) != 0)
2932 	{
2933 	  /* Allocate memory for the section contents.  */
2934 	  s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2935 	  if (s->contents == NULL)
2936 	    return FALSE;
2937 	}
2938     }
2939 
2940   if (elf_hash_table (info)->dynamic_sections_created)
2941     {
2942       /* Add some entries to the .dynamic section.  We fill in the
2943 	 values later, in elf64_alpha_finish_dynamic_sections, but we
2944 	 must add the entries now so that we get the correct size for
2945 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2946 	 dynamic linker and used by the debugger.  */
2947 #define add_dynamic_entry(TAG, VAL) \
2948   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2949 
2950       if (info->executable)
2951 	{
2952 	  if (!add_dynamic_entry (DT_DEBUG, 0))
2953 	    return FALSE;
2954 	}
2955 
2956       if (relplt)
2957 	{
2958 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
2959 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
2960 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2961 	      || !add_dynamic_entry (DT_JMPREL, 0))
2962 	    return FALSE;
2963 
2964 	  if (elf64_alpha_use_secureplt
2965 	      && !add_dynamic_entry (DT_ALPHA_PLTRO, 1))
2966 	    return FALSE;
2967 	}
2968 
2969       if (!add_dynamic_entry (DT_RELA, 0)
2970 	  || !add_dynamic_entry (DT_RELASZ, 0)
2971 	  || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2972 	return FALSE;
2973 
2974       if (info->flags & DF_TEXTREL)
2975 	{
2976 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
2977 	    return FALSE;
2978 	}
2979     }
2980 #undef add_dynamic_entry
2981 
2982   return TRUE;
2983 }
2984 
2985 /* These functions do relaxation for Alpha ELF.
2986 
2987    Currently I'm only handling what I can do with existing compiler
2988    and assembler support, which means no instructions are removed,
2989    though some may be nopped.  At this time GCC does not emit enough
2990    information to do all of the relaxing that is possible.  It will
2991    take some not small amount of work for that to happen.
2992 
2993    There are a couple of interesting papers that I once read on this
2994    subject, that I cannot find references to at the moment, that
2995    related to Alpha in particular.  They are by David Wall, then of
2996    DEC WRL.  */
2997 
2998 struct alpha_relax_info
2999 {
3000   bfd *abfd;
3001   asection *sec;
3002   bfd_byte *contents;
3003   Elf_Internal_Shdr *symtab_hdr;
3004   Elf_Internal_Rela *relocs, *relend;
3005   struct bfd_link_info *link_info;
3006   bfd_vma gp;
3007   bfd *gotobj;
3008   asection *tsec;
3009   struct alpha_elf_link_hash_entry *h;
3010   struct alpha_elf_got_entry **first_gotent;
3011   struct alpha_elf_got_entry *gotent;
3012   bfd_boolean changed_contents;
3013   bfd_boolean changed_relocs;
3014   unsigned char other;
3015 };
3016 
3017 static Elf_Internal_Rela *
3018 elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela *rel,
3019 			       Elf_Internal_Rela *relend,
3020 			       bfd_vma offset, int type)
3021 {
3022   while (rel < relend)
3023     {
3024       if (rel->r_offset == offset
3025 	  && ELF64_R_TYPE (rel->r_info) == (unsigned int) type)
3026 	return rel;
3027       ++rel;
3028     }
3029   return NULL;
3030 }
3031 
3032 static bfd_boolean
3033 elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
3034 			    Elf_Internal_Rela *irel, unsigned long r_type)
3035 {
3036   unsigned int insn;
3037   bfd_signed_vma disp;
3038 
3039   /* Get the instruction.  */
3040   insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
3041 
3042   if (insn >> 26 != OP_LDQ)
3043     {
3044       reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
3045       ((*_bfd_error_handler)
3046        ("%B: %A+0x%lx: warning: %s relocation against unexpected insn",
3047 	info->abfd, info->sec,
3048 	(unsigned long) irel->r_offset, howto->name));
3049       return TRUE;
3050     }
3051 
3052   /* Can't relax dynamic symbols.  */
3053   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3054     return TRUE;
3055 
3056   /* Can't use local-exec relocations in shared libraries.  */
3057   if (r_type == R_ALPHA_GOTTPREL
3058       && (info->link_info->shared && !info->link_info->pie))
3059     return TRUE;
3060 
3061   if (r_type == R_ALPHA_LITERAL)
3062     {
3063       /* Look for nice constant addresses.  This includes the not-uncommon
3064 	 special case of 0 for undefweak symbols.  */
3065       if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3066 	  || (!info->link_info->shared
3067 	      && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3068 	{
3069 	  disp = 0;
3070 	  insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3071 	  insn |= (symval & 0xffff);
3072 	  r_type = R_ALPHA_NONE;
3073 	}
3074       else
3075 	{
3076 	  disp = symval - info->gp;
3077 	  insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3078 	  r_type = R_ALPHA_GPREL16;
3079 	}
3080     }
3081   else
3082     {
3083       bfd_vma dtp_base, tp_base;
3084 
3085       BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3086       dtp_base = alpha_get_dtprel_base (info->link_info);
3087       tp_base = alpha_get_tprel_base (info->link_info);
3088       disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3089 
3090       insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3091 
3092       switch (r_type)
3093 	{
3094 	case R_ALPHA_GOTDTPREL:
3095 	  r_type = R_ALPHA_DTPREL16;
3096 	  break;
3097 	case R_ALPHA_GOTTPREL:
3098 	  r_type = R_ALPHA_TPREL16;
3099 	  break;
3100 	default:
3101 	  BFD_ASSERT (0);
3102 	  return FALSE;
3103 	}
3104     }
3105 
3106   if (disp < -0x8000 || disp >= 0x8000)
3107     return TRUE;
3108 
3109   bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3110   info->changed_contents = TRUE;
3111 
3112   /* Reduce the use count on this got entry by one, possibly
3113      eliminating it.  */
3114   if (--info->gotent->use_count == 0)
3115     {
3116       int sz = alpha_got_entry_size (r_type);
3117       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3118       if (!info->h)
3119 	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3120     }
3121 
3122   /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3123   irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3124   info->changed_relocs = TRUE;
3125 
3126   /* ??? Search forward through this basic block looking for insns
3127      that use the target register.  Stop after an insn modifying the
3128      register is seen, or after a branch or call.
3129 
3130      Any such memory load insn may be substituted by a load directly
3131      off the GP.  This allows the memory load insn to be issued before
3132      the calculated GP register would otherwise be ready.
3133 
3134      Any such jsr insn can be replaced by a bsr if it is in range.
3135 
3136      This would mean that we'd have to _add_ relocations, the pain of
3137      which gives one pause.  */
3138 
3139   return TRUE;
3140 }
3141 
3142 static bfd_vma
3143 elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3144 {
3145   /* If the function has the same gp, and we can identify that the
3146      function does not use its function pointer, we can eliminate the
3147      address load.  */
3148 
3149   /* If the symbol is marked NOPV, we are being told the function never
3150      needs its procedure value.  */
3151   if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3152     return symval;
3153 
3154   /* If the symbol is marked STD_GP, we are being told the function does
3155      a normal ldgp in the first two words.  */
3156   else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3157     ;
3158 
3159   /* Otherwise, we may be able to identify a GP load in the first two
3160      words, which we can then skip.  */
3161   else
3162     {
3163       Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3164       bfd_vma ofs;
3165 
3166       /* Load the relocations from the section that the target symbol is in.  */
3167       if (info->sec == info->tsec)
3168 	{
3169 	  tsec_relocs = info->relocs;
3170 	  tsec_relend = info->relend;
3171 	  tsec_free = NULL;
3172 	}
3173       else
3174 	{
3175 	  tsec_relocs = (_bfd_elf_link_read_relocs
3176 		         (info->abfd, info->tsec, NULL,
3177 			 (Elf_Internal_Rela *) NULL,
3178 			 info->link_info->keep_memory));
3179 	  if (tsec_relocs == NULL)
3180 	    return 0;
3181 	  tsec_relend = tsec_relocs + info->tsec->reloc_count;
3182 	  tsec_free = (info->link_info->keep_memory ? NULL : tsec_relocs);
3183 	}
3184 
3185       /* Recover the symbol's offset within the section.  */
3186       ofs = (symval - info->tsec->output_section->vma
3187 	     - info->tsec->output_offset);
3188 
3189       /* Look for a GPDISP reloc.  */
3190       gpdisp = (elf64_alpha_find_reloc_at_ofs
3191 		(tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3192 
3193       if (!gpdisp || gpdisp->r_addend != 4)
3194 	{
3195 	  if (tsec_free)
3196 	    free (tsec_free);
3197 	  return 0;
3198 	}
3199       if (tsec_free)
3200         free (tsec_free);
3201     }
3202 
3203   /* We've now determined that we can skip an initial gp load.  Verify
3204      that the call and the target use the same gp.   */
3205   if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3206       || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3207     return 0;
3208 
3209   return symval + 8;
3210 }
3211 
3212 static bfd_boolean
3213 elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3214 			       bfd_vma symval, Elf_Internal_Rela *irel)
3215 {
3216   Elf_Internal_Rela *urel, *irelend = info->relend;
3217   int flags, count, i;
3218   bfd_signed_vma disp;
3219   bfd_boolean fits16;
3220   bfd_boolean fits32;
3221   bfd_boolean lit_reused = FALSE;
3222   bfd_boolean all_optimized = TRUE;
3223   unsigned int lit_insn;
3224 
3225   lit_insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
3226   if (lit_insn >> 26 != OP_LDQ)
3227     {
3228       ((*_bfd_error_handler)
3229        ("%B: %A+0x%lx: warning: LITERAL relocation against unexpected insn",
3230 	info->abfd, info->sec,
3231 	(unsigned long) irel->r_offset));
3232       return TRUE;
3233     }
3234 
3235   /* Can't relax dynamic symbols.  */
3236   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3237     return TRUE;
3238 
3239   /* Summarize how this particular LITERAL is used.  */
3240   for (urel = irel+1, flags = count = 0; urel < irelend; ++urel, ++count)
3241     {
3242       if (ELF64_R_TYPE (urel->r_info) != R_ALPHA_LITUSE)
3243 	break;
3244       if (urel->r_addend <= 6)
3245 	flags |= 1 << urel->r_addend;
3246     }
3247 
3248   /* A little preparation for the loop...  */
3249   disp = symval - info->gp;
3250 
3251   for (urel = irel+1, i = 0; i < count; ++i, ++urel)
3252     {
3253       unsigned int insn;
3254       int insn_disp;
3255       bfd_signed_vma xdisp;
3256 
3257       insn = bfd_get_32 (info->abfd, info->contents + urel->r_offset);
3258 
3259       switch (urel->r_addend)
3260 	{
3261 	case LITUSE_ALPHA_ADDR:
3262 	default:
3263 	  /* This type is really just a placeholder to note that all
3264 	     uses cannot be optimized, but to still allow some.  */
3265 	  all_optimized = FALSE;
3266 	  break;
3267 
3268 	case LITUSE_ALPHA_BASE:
3269 	  /* We can always optimize 16-bit displacements.  */
3270 
3271 	  /* Extract the displacement from the instruction, sign-extending
3272 	     it if necessary, then test whether it is within 16 or 32 bits
3273 	     displacement from GP.  */
3274 	  insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3275 
3276 	  xdisp = disp + insn_disp;
3277 	  fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3278 	  fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3279 		    && xdisp < 0x7fff8000);
3280 
3281 	  if (fits16)
3282 	    {
3283 	      /* Take the op code and dest from this insn, take the base
3284 		 register from the literal insn.  Leave the offset alone.  */
3285 	      insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3286 	      urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3287 					   R_ALPHA_GPREL16);
3288 	      urel->r_addend = irel->r_addend;
3289 	      info->changed_relocs = TRUE;
3290 
3291 	      bfd_put_32 (info->abfd, (bfd_vma) insn,
3292 			  info->contents + urel->r_offset);
3293 	      info->changed_contents = TRUE;
3294 	    }
3295 
3296 	  /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3297 	  else if (fits32 && !(flags & ~6))
3298 	    {
3299 	      /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3300 
3301 	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3302 					   R_ALPHA_GPRELHIGH);
3303 	      lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3304 	      bfd_put_32 (info->abfd, (bfd_vma) lit_insn,
3305 			  info->contents + irel->r_offset);
3306 	      lit_reused = TRUE;
3307 	      info->changed_contents = TRUE;
3308 
3309 	      urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3310 					   R_ALPHA_GPRELLOW);
3311 	      urel->r_addend = irel->r_addend;
3312 	      info->changed_relocs = TRUE;
3313 	    }
3314 	  else
3315 	    all_optimized = FALSE;
3316 	  break;
3317 
3318 	case LITUSE_ALPHA_BYTOFF:
3319 	  /* We can always optimize byte instructions.  */
3320 
3321 	  /* FIXME: sanity check the insn for byte op.  Check that the
3322 	     literal dest reg is indeed Rb in the byte insn.  */
3323 
3324 	  insn &= ~ (unsigned) 0x001ff000;
3325 	  insn |= ((symval & 7) << 13) | 0x1000;
3326 
3327 	  urel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3328 	  urel->r_addend = 0;
3329 	  info->changed_relocs = TRUE;
3330 
3331 	  bfd_put_32 (info->abfd, (bfd_vma) insn,
3332 		      info->contents + urel->r_offset);
3333 	  info->changed_contents = TRUE;
3334 	  break;
3335 
3336 	case LITUSE_ALPHA_JSR:
3337 	case LITUSE_ALPHA_TLSGD:
3338 	case LITUSE_ALPHA_TLSLDM:
3339 	case LITUSE_ALPHA_JSRDIRECT:
3340 	  {
3341 	    bfd_vma optdest, org;
3342 	    bfd_signed_vma odisp;
3343 
3344 	    /* For undefined weak symbols, we're mostly interested in getting
3345 	       rid of the got entry whenever possible, so optimize this to a
3346 	       use of the zero register.  */
3347 	    if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3348 	      {
3349 		insn |= 31 << 16;
3350 		bfd_put_32 (info->abfd, (bfd_vma) insn,
3351 			    info->contents + urel->r_offset);
3352 
3353 		info->changed_contents = TRUE;
3354 		break;
3355 	      }
3356 
3357 	    /* If not zero, place to jump without needing pv.  */
3358 	    optdest = elf64_alpha_relax_opt_call (info, symval);
3359 	    org = (info->sec->output_section->vma
3360 		   + info->sec->output_offset
3361 		   + urel->r_offset + 4);
3362 	    odisp = (optdest ? optdest : symval) - org;
3363 
3364 	    if (odisp >= -0x400000 && odisp < 0x400000)
3365 	      {
3366 		Elf_Internal_Rela *xrel;
3367 
3368 		/* Preserve branch prediction call stack when possible.  */
3369 		if ((insn & INSN_JSR_MASK) == INSN_JSR)
3370 		  insn = (OP_BSR << 26) | (insn & 0x03e00000);
3371 		else
3372 		  insn = (OP_BR << 26) | (insn & 0x03e00000);
3373 
3374 		urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3375 					     R_ALPHA_BRADDR);
3376 		urel->r_addend = irel->r_addend;
3377 
3378 		if (optdest)
3379 		  urel->r_addend += optdest - symval;
3380 		else
3381 		  all_optimized = FALSE;
3382 
3383 		bfd_put_32 (info->abfd, (bfd_vma) insn,
3384 			    info->contents + urel->r_offset);
3385 
3386 		/* Kill any HINT reloc that might exist for this insn.  */
3387 		xrel = (elf64_alpha_find_reloc_at_ofs
3388 			(info->relocs, info->relend, urel->r_offset,
3389 			 R_ALPHA_HINT));
3390 		if (xrel)
3391 		  xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3392 
3393 		info->changed_contents = TRUE;
3394 		info->changed_relocs = TRUE;
3395 	      }
3396 	    else
3397 	      all_optimized = FALSE;
3398 
3399 	    /* Even if the target is not in range for a direct branch,
3400 	       if we share a GP, we can eliminate the gp reload.  */
3401 	    if (optdest)
3402 	      {
3403 		Elf_Internal_Rela *gpdisp
3404 		  = (elf64_alpha_find_reloc_at_ofs
3405 		     (info->relocs, irelend, urel->r_offset + 4,
3406 		      R_ALPHA_GPDISP));
3407 		if (gpdisp)
3408 		  {
3409 		    bfd_byte *p_ldah = info->contents + gpdisp->r_offset;
3410 		    bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3411 		    unsigned int ldah = bfd_get_32 (info->abfd, p_ldah);
3412 		    unsigned int lda = bfd_get_32 (info->abfd, p_lda);
3413 
3414 		    /* Verify that the instruction is "ldah $29,0($26)".
3415 		       Consider a function that ends in a noreturn call,
3416 		       and that the next function begins with an ldgp,
3417 		       and that by accident there is no padding between.
3418 		       In that case the insn would use $27 as the base.  */
3419 		    if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3420 		      {
3421 			bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, p_ldah);
3422 			bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, p_lda);
3423 
3424 			gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3425 			info->changed_contents = TRUE;
3426 			info->changed_relocs = TRUE;
3427 		      }
3428 		  }
3429 	      }
3430 	  }
3431 	  break;
3432 	}
3433     }
3434 
3435   /* If all cases were optimized, we can reduce the use count on this
3436      got entry by one, possibly eliminating it.  */
3437   if (all_optimized)
3438     {
3439       if (--info->gotent->use_count == 0)
3440 	{
3441 	  int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3442 	  alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3443 	  if (!info->h)
3444 	    alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3445 	}
3446 
3447       /* If the literal instruction is no longer needed (it may have been
3448 	 reused.  We can eliminate it.  */
3449       /* ??? For now, I don't want to deal with compacting the section,
3450 	 so just nop it out.  */
3451       if (!lit_reused)
3452 	{
3453 	  irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3454 	  info->changed_relocs = TRUE;
3455 
3456 	  bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP,
3457 		      info->contents + irel->r_offset);
3458 	  info->changed_contents = TRUE;
3459 	}
3460 
3461       return TRUE;
3462     }
3463   else
3464     return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3465 }
3466 
3467 static bfd_boolean
3468 elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3469 				Elf_Internal_Rela *irel, bfd_boolean is_gd)
3470 {
3471   bfd_byte *pos[5];
3472   unsigned int insn, tlsgd_reg;
3473   Elf_Internal_Rela *gpdisp, *hint;
3474   bfd_boolean dynamic, use_gottprel;
3475   unsigned long new_symndx;
3476 
3477   dynamic = alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info);
3478 
3479   /* If a TLS symbol is accessed using IE at least once, there is no point
3480      to use dynamic model for it.  */
3481   if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3482     ;
3483 
3484   /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3485      then we might as well relax to IE.  */
3486   else if (info->link_info->shared && !dynamic
3487 	   && (info->link_info->flags & DF_STATIC_TLS))
3488     ;
3489 
3490   /* Otherwise we must be building an executable to do anything.  */
3491   else if (info->link_info->shared)
3492     return TRUE;
3493 
3494   /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3495      the matching LITUSE_TLS relocations.  */
3496   if (irel + 2 >= info->relend)
3497     return TRUE;
3498   if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3499       || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3500       || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3501     return TRUE;
3502 
3503   /* There must be a GPDISP relocation positioned immediately after the
3504      LITUSE relocation.  */
3505   gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3506 					  irel[2].r_offset + 4, R_ALPHA_GPDISP);
3507   if (!gpdisp)
3508     return TRUE;
3509 
3510   pos[0] = info->contents + irel[0].r_offset;
3511   pos[1] = info->contents + irel[1].r_offset;
3512   pos[2] = info->contents + irel[2].r_offset;
3513   pos[3] = info->contents + gpdisp->r_offset;
3514   pos[4] = pos[3] + gpdisp->r_addend;
3515 
3516   /* Beware of the compiler hoisting part of the sequence out a loop
3517      and adjusting the destination register for the TLSGD insn.  If this
3518      happens, there will be a move into $16 before the JSR insn, so only
3519      transformations of the first insn pair should use this register.  */
3520   tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3521   tlsgd_reg = (tlsgd_reg >> 21) & 31;
3522 
3523   /* Generally, the positions are not allowed to be out of order, lest the
3524      modified insn sequence have different register lifetimes.  We can make
3525      an exception when pos 1 is adjacent to pos 0.  */
3526   if (pos[1] + 4 == pos[0])
3527     {
3528       bfd_byte *tmp = pos[0];
3529       pos[0] = pos[1];
3530       pos[1] = tmp;
3531     }
3532   if (pos[1] >= pos[2] || pos[2] >= pos[3])
3533     return TRUE;
3534 
3535   /* Reduce the use count on the LITERAL relocation.  Do this before we
3536      smash the symndx when we adjust the relocations below.  */
3537   {
3538     struct alpha_elf_got_entry *lit_gotent;
3539     struct alpha_elf_link_hash_entry *lit_h;
3540     unsigned long indx;
3541 
3542     BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3543     indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3544     lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3545 
3546     while (lit_h->root.root.type == bfd_link_hash_indirect
3547 	   || lit_h->root.root.type == bfd_link_hash_warning)
3548       lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3549 
3550     for (lit_gotent = lit_h->got_entries; lit_gotent ;
3551 	 lit_gotent = lit_gotent->next)
3552       if (lit_gotent->gotobj == info->gotobj
3553 	  && lit_gotent->reloc_type == R_ALPHA_LITERAL
3554 	  && lit_gotent->addend == irel[1].r_addend)
3555 	break;
3556     BFD_ASSERT (lit_gotent);
3557 
3558     if (--lit_gotent->use_count == 0)
3559       {
3560 	int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3561 	alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3562       }
3563   }
3564 
3565   /* Change
3566 
3567 	lda	$16,x($gp)			!tlsgd!1
3568 	ldq	$27,__tls_get_addr($gp)		!literal!1
3569 	jsr	$26,($27),__tls_get_addr	!lituse_tlsgd!1
3570 	ldah	$29,0($26)			!gpdisp!2
3571 	lda	$29,0($29)			!gpdisp!2
3572      to
3573 	ldq	$16,x($gp)			!gottprel
3574 	unop
3575 	call_pal rduniq
3576 	addq	$16,$0,$0
3577 	unop
3578      or the first pair to
3579 	lda	$16,x($gp)			!tprel
3580 	unop
3581      or
3582 	ldah	$16,x($gp)			!tprelhi
3583 	lda	$16,x($16)			!tprello
3584 
3585      as appropriate.  */
3586 
3587   use_gottprel = FALSE;
3588   new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3589 
3590   switch (!dynamic && !info->link_info->shared)
3591     {
3592     case 1:
3593       {
3594 	bfd_vma tp_base;
3595 	bfd_signed_vma disp;
3596 
3597 	BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3598 	tp_base = alpha_get_tprel_base (info->link_info);
3599 	disp = symval - tp_base;
3600 
3601 	if (disp >= -0x8000 && disp < 0x8000)
3602 	  {
3603 	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3604 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3605 	    bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3606 
3607 	    irel[0].r_offset = pos[0] - info->contents;
3608 	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3609 	    irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3610 	    break;
3611 	  }
3612 	else if (disp >= -(bfd_signed_vma) 0x80000000
3613 		 && disp < (bfd_signed_vma) 0x7fff8000
3614 		 && pos[0] + 4 == pos[1])
3615 	  {
3616 	    insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3617 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3618 	    insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3619 	    bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3620 
3621 	    irel[0].r_offset = pos[0] - info->contents;
3622 	    irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3623 	    irel[1].r_offset = pos[1] - info->contents;
3624 	    irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3625 	    break;
3626 	  }
3627       }
3628       /* FALLTHRU */
3629 
3630     default:
3631       use_gottprel = TRUE;
3632 
3633       insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3634       bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3635       bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3636 
3637       irel[0].r_offset = pos[0] - info->contents;
3638       irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3639       irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3640       break;
3641     }
3642 
3643   bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3644 
3645   insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3646   bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3647 
3648   bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3649 
3650   irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3651   gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3652 
3653   hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3654 					irel[2].r_offset, R_ALPHA_HINT);
3655   if (hint)
3656     hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3657 
3658   info->changed_contents = TRUE;
3659   info->changed_relocs = TRUE;
3660 
3661   /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3662   if (--info->gotent->use_count == 0)
3663     {
3664       int sz = alpha_got_entry_size (info->gotent->reloc_type);
3665       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3666       if (!info->h)
3667 	alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3668     }
3669 
3670   /* If we've switched to a GOTTPREL relocation, increment the reference
3671      count on that got entry.  */
3672   if (use_gottprel)
3673     {
3674       struct alpha_elf_got_entry *tprel_gotent;
3675 
3676       for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3677 	   tprel_gotent = tprel_gotent->next)
3678 	if (tprel_gotent->gotobj == info->gotobj
3679 	    && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3680 	    && tprel_gotent->addend == irel->r_addend)
3681 	  break;
3682       if (tprel_gotent)
3683 	tprel_gotent->use_count++;
3684       else
3685 	{
3686 	  if (info->gotent->use_count == 0)
3687 	    tprel_gotent = info->gotent;
3688 	  else
3689 	    {
3690 	      tprel_gotent = (struct alpha_elf_got_entry *)
3691 		bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3692 	      if (!tprel_gotent)
3693 		return FALSE;
3694 
3695 	      tprel_gotent->next = *info->first_gotent;
3696 	      *info->first_gotent = tprel_gotent;
3697 
3698 	      tprel_gotent->gotobj = info->gotobj;
3699 	      tprel_gotent->addend = irel->r_addend;
3700 	      tprel_gotent->got_offset = -1;
3701 	      tprel_gotent->reloc_done = 0;
3702 	      tprel_gotent->reloc_xlated = 0;
3703 	    }
3704 
3705 	  tprel_gotent->use_count = 1;
3706 	  tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3707 	}
3708     }
3709 
3710   return TRUE;
3711 }
3712 
3713 static bfd_boolean
3714 elf64_alpha_relax_section (bfd *abfd, asection *sec,
3715 			   struct bfd_link_info *link_info, bfd_boolean *again)
3716 {
3717   Elf_Internal_Shdr *symtab_hdr;
3718   Elf_Internal_Rela *internal_relocs;
3719   Elf_Internal_Rela *irel, *irelend;
3720   Elf_Internal_Sym *isymbuf = NULL;
3721   struct alpha_elf_got_entry **local_got_entries;
3722   struct alpha_relax_info info;
3723   struct alpha_elf_link_hash_table * htab;
3724 
3725   htab = alpha_elf_hash_table (link_info);
3726   if (htab == NULL)
3727     return FALSE;
3728 
3729   /* There's nothing to change, yet.  */
3730   *again = FALSE;
3731 
3732   if (link_info->relocatable
3733       || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3734 	  != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3735       || sec->reloc_count == 0)
3736     return TRUE;
3737 
3738   BFD_ASSERT (is_alpha_elf (abfd));
3739 
3740   /* Make sure our GOT and PLT tables are up-to-date.  */
3741   if (htab->relax_trip != link_info->relax_trip)
3742     {
3743       htab->relax_trip = link_info->relax_trip;
3744 
3745       /* This should never fail after the initial round, since the only
3746 	 error is GOT overflow, and relaxation only shrinks the table.  */
3747       if (!elf64_alpha_size_got_sections (link_info))
3748 	abort ();
3749       if (elf_hash_table (link_info)->dynamic_sections_created)
3750 	{
3751 	  elf64_alpha_size_plt_section (link_info);
3752 	  elf64_alpha_size_rela_got_section (link_info);
3753 	}
3754     }
3755 
3756   symtab_hdr = &elf_symtab_hdr (abfd);
3757   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3758 
3759   /* Load the relocations for this section.  */
3760   internal_relocs = (_bfd_elf_link_read_relocs
3761 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3762 		      link_info->keep_memory));
3763   if (internal_relocs == NULL)
3764     return FALSE;
3765 
3766   memset(&info, 0, sizeof (info));
3767   info.abfd = abfd;
3768   info.sec = sec;
3769   info.link_info = link_info;
3770   info.symtab_hdr = symtab_hdr;
3771   info.relocs = internal_relocs;
3772   info.relend = irelend = internal_relocs + sec->reloc_count;
3773 
3774   /* Find the GP for this object.  Do not store the result back via
3775      _bfd_set_gp_value, since this could change again before final.  */
3776   info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3777   if (info.gotobj)
3778     {
3779       asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3780       info.gp = (sgot->output_section->vma
3781 		 + sgot->output_offset
3782 		 + 0x8000);
3783     }
3784 
3785   /* Get the section contents.  */
3786   if (elf_section_data (sec)->this_hdr.contents != NULL)
3787     info.contents = elf_section_data (sec)->this_hdr.contents;
3788   else
3789     {
3790       if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3791 	goto error_return;
3792     }
3793 
3794   for (irel = internal_relocs; irel < irelend; irel++)
3795     {
3796       bfd_vma symval;
3797       struct alpha_elf_got_entry *gotent;
3798       unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3799       unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3800 
3801       /* Early exit for unhandled or unrelaxable relocations.  */
3802       switch (r_type)
3803 	{
3804 	case R_ALPHA_LITERAL:
3805 	case R_ALPHA_GPRELHIGH:
3806 	case R_ALPHA_GPRELLOW:
3807 	case R_ALPHA_GOTDTPREL:
3808 	case R_ALPHA_GOTTPREL:
3809 	case R_ALPHA_TLSGD:
3810 	  break;
3811 
3812 	case R_ALPHA_TLSLDM:
3813 	  /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3814              reloc to the STN_UNDEF (0) symbol so that they all match.  */
3815 	  r_symndx = STN_UNDEF;
3816 	  break;
3817 
3818 	default:
3819 	  continue;
3820 	}
3821 
3822       /* Get the value of the symbol referred to by the reloc.  */
3823       if (r_symndx < symtab_hdr->sh_info)
3824 	{
3825 	  /* A local symbol.  */
3826 	  Elf_Internal_Sym *isym;
3827 
3828 	  /* Read this BFD's local symbols.  */
3829 	  if (isymbuf == NULL)
3830 	    {
3831 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3832 	      if (isymbuf == NULL)
3833 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3834 						symtab_hdr->sh_info, 0,
3835 						NULL, NULL, NULL);
3836 	      if (isymbuf == NULL)
3837 		goto error_return;
3838 	    }
3839 
3840 	  isym = isymbuf + r_symndx;
3841 
3842 	  /* Given the symbol for a TLSLDM reloc is ignored, this also
3843 	     means forcing the symbol value to the tp base.  */
3844 	  if (r_type == R_ALPHA_TLSLDM)
3845 	    {
3846 	      info.tsec = bfd_abs_section_ptr;
3847 	      symval = alpha_get_tprel_base (info.link_info);
3848 	    }
3849 	  else
3850 	    {
3851 	      symval = isym->st_value;
3852 	      if (isym->st_shndx == SHN_UNDEF)
3853 	        continue;
3854 	      else if (isym->st_shndx == SHN_ABS)
3855 	        info.tsec = bfd_abs_section_ptr;
3856 	      else if (isym->st_shndx == SHN_COMMON)
3857 	        info.tsec = bfd_com_section_ptr;
3858 	      else
3859 	        info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3860 	    }
3861 
3862 	  info.h = NULL;
3863 	  info.other = isym->st_other;
3864 	  if (local_got_entries)
3865 	    info.first_gotent = &local_got_entries[r_symndx];
3866 	  else
3867 	    {
3868 	      info.first_gotent = &info.gotent;
3869 	      info.gotent = NULL;
3870 	    }
3871 	}
3872       else
3873 	{
3874 	  unsigned long indx;
3875 	  struct alpha_elf_link_hash_entry *h;
3876 
3877 	  indx = r_symndx - symtab_hdr->sh_info;
3878 	  h = alpha_elf_sym_hashes (abfd)[indx];
3879 	  BFD_ASSERT (h != NULL);
3880 
3881 	  while (h->root.root.type == bfd_link_hash_indirect
3882 		 || h->root.root.type == bfd_link_hash_warning)
3883 	    h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3884 
3885 	  /* If the symbol is undefined, we can't do anything with it.  */
3886 	  if (h->root.root.type == bfd_link_hash_undefined)
3887 	    continue;
3888 
3889 	  /* If the symbol isn't defined in the current module,
3890 	     again we can't do anything.  */
3891 	  if (h->root.root.type == bfd_link_hash_undefweak)
3892 	    {
3893 	      info.tsec = bfd_abs_section_ptr;
3894 	      symval = 0;
3895 	    }
3896 	  else if (!h->root.def_regular)
3897 	    {
3898 	      /* Except for TLSGD relocs, which can sometimes be
3899 		 relaxed to GOTTPREL relocs.  */
3900 	      if (r_type != R_ALPHA_TLSGD)
3901 		continue;
3902 	      info.tsec = bfd_abs_section_ptr;
3903 	      symval = 0;
3904 	    }
3905 	  else
3906 	    {
3907 	      info.tsec = h->root.root.u.def.section;
3908 	      symval = h->root.root.u.def.value;
3909 	    }
3910 
3911 	  info.h = h;
3912 	  info.other = h->root.other;
3913 	  info.first_gotent = &h->got_entries;
3914 	}
3915 
3916       /* Search for the got entry to be used by this relocation.  */
3917       for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3918 	if (gotent->gotobj == info.gotobj
3919 	    && gotent->reloc_type == r_type
3920 	    && gotent->addend == irel->r_addend)
3921 	  break;
3922       info.gotent = gotent;
3923 
3924       symval += info.tsec->output_section->vma + info.tsec->output_offset;
3925       symval += irel->r_addend;
3926 
3927       switch (r_type)
3928 	{
3929 	case R_ALPHA_LITERAL:
3930 	  BFD_ASSERT(info.gotent != NULL);
3931 
3932 	  /* If there exist LITUSE relocations immediately following, this
3933 	     opens up all sorts of interesting optimizations, because we
3934 	     now know every location that this address load is used.  */
3935 	  if (irel+1 < irelend
3936 	      && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3937 	    {
3938 	      if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3939 		goto error_return;
3940 	    }
3941 	  else
3942 	    {
3943 	      if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3944 		goto error_return;
3945 	    }
3946 	  break;
3947 
3948 	case R_ALPHA_GOTDTPREL:
3949 	case R_ALPHA_GOTTPREL:
3950 	  BFD_ASSERT(info.gotent != NULL);
3951 	  if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3952 	    goto error_return;
3953 	  break;
3954 
3955 	case R_ALPHA_TLSGD:
3956 	case R_ALPHA_TLSLDM:
3957 	  BFD_ASSERT(info.gotent != NULL);
3958 	  if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3959 					       r_type == R_ALPHA_TLSGD))
3960 	    goto error_return;
3961 	  break;
3962 	}
3963     }
3964 
3965   if (isymbuf != NULL
3966       && symtab_hdr->contents != (unsigned char *) isymbuf)
3967     {
3968       if (!link_info->keep_memory)
3969 	free (isymbuf);
3970       else
3971 	{
3972 	  /* Cache the symbols for elf_link_input_bfd.  */
3973 	  symtab_hdr->contents = (unsigned char *) isymbuf;
3974 	}
3975     }
3976 
3977   if (info.contents != NULL
3978       && elf_section_data (sec)->this_hdr.contents != info.contents)
3979     {
3980       if (!info.changed_contents && !link_info->keep_memory)
3981 	free (info.contents);
3982       else
3983 	{
3984 	  /* Cache the section contents for elf_link_input_bfd.  */
3985 	  elf_section_data (sec)->this_hdr.contents = info.contents;
3986 	}
3987     }
3988 
3989   if (elf_section_data (sec)->relocs != internal_relocs)
3990     {
3991       if (!info.changed_relocs)
3992 	free (internal_relocs);
3993       else
3994 	elf_section_data (sec)->relocs = internal_relocs;
3995     }
3996 
3997   *again = info.changed_contents || info.changed_relocs;
3998 
3999   return TRUE;
4000 
4001  error_return:
4002   if (isymbuf != NULL
4003       && symtab_hdr->contents != (unsigned char *) isymbuf)
4004     free (isymbuf);
4005   if (info.contents != NULL
4006       && elf_section_data (sec)->this_hdr.contents != info.contents)
4007     free (info.contents);
4008   if (internal_relocs != NULL
4009       && elf_section_data (sec)->relocs != internal_relocs)
4010     free (internal_relocs);
4011   return FALSE;
4012 }
4013 
4014 /* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4015    into the next available slot in SREL.  */
4016 
4017 static void
4018 elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4019 			 asection *sec, asection *srel, bfd_vma offset,
4020 			 long dynindx, long rtype, bfd_vma addend)
4021 {
4022   Elf_Internal_Rela outrel;
4023   bfd_byte *loc;
4024 
4025   BFD_ASSERT (srel != NULL);
4026 
4027   outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4028   outrel.r_addend = addend;
4029 
4030   offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4031   if ((offset | 1) != (bfd_vma) -1)
4032     outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4033   else
4034     memset (&outrel, 0, sizeof (outrel));
4035 
4036   loc = srel->contents;
4037   loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4038   bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4039   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4040 }
4041 
4042 /* Relocate an Alpha ELF section for a relocatable link.
4043 
4044    We don't have to change anything unless the reloc is against a section
4045    symbol, in which case we have to adjust according to where the section
4046    symbol winds up in the output section.  */
4047 
4048 static bfd_boolean
4049 elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4050 				struct bfd_link_info *info ATTRIBUTE_UNUSED,
4051 				bfd *input_bfd, asection *input_section,
4052 				bfd_byte *contents ATTRIBUTE_UNUSED,
4053 				Elf_Internal_Rela *relocs,
4054 				Elf_Internal_Sym *local_syms,
4055 				asection **local_sections)
4056 {
4057   unsigned long symtab_hdr_sh_info;
4058   Elf_Internal_Rela *rel;
4059   Elf_Internal_Rela *relend;
4060   struct elf_link_hash_entry **sym_hashes;
4061   bfd_boolean ret_val = TRUE;
4062 
4063   symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4064   sym_hashes = elf_sym_hashes (input_bfd);
4065 
4066   relend = relocs + input_section->reloc_count;
4067   for (rel = relocs; rel < relend; rel++)
4068     {
4069       unsigned long r_symndx;
4070       Elf_Internal_Sym *sym;
4071       asection *sec;
4072       unsigned long r_type;
4073 
4074       r_type = ELF64_R_TYPE (rel->r_info);
4075       if (r_type >= R_ALPHA_max)
4076 	{
4077 	  (*_bfd_error_handler)
4078 	    (_("%B: unknown relocation type %d"),
4079 	     input_bfd, (int) r_type);
4080 	  bfd_set_error (bfd_error_bad_value);
4081 	  ret_val = FALSE;
4082 	  continue;
4083 	}
4084 
4085       /* The symbol associated with GPDISP and LITUSE is
4086 	 immaterial.  Only the addend is significant.  */
4087       if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4088 	continue;
4089 
4090       r_symndx = ELF64_R_SYM (rel->r_info);
4091       if (r_symndx < symtab_hdr_sh_info)
4092 	{
4093 	  sym = local_syms + r_symndx;
4094 	  sec = local_sections[r_symndx];
4095 	}
4096       else
4097 	{
4098 	  struct elf_link_hash_entry *h;
4099 
4100 	  h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4101 
4102 	  while (h->root.type == bfd_link_hash_indirect
4103 		 || h->root.type == bfd_link_hash_warning)
4104 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4105 
4106 	  if (h->root.type != bfd_link_hash_defined
4107 	      && h->root.type != bfd_link_hash_defweak)
4108 	    continue;
4109 
4110 	  sym = NULL;
4111 	  sec = h->root.u.def.section;
4112 	}
4113 
4114       if (sec != NULL && discarded_section (sec))
4115 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4116 					 rel, 1, relend,
4117 					 elf64_alpha_howto_table + r_type, 0,
4118 					 contents);
4119 
4120       if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4121 	rel->r_addend += sec->output_offset;
4122     }
4123 
4124   return ret_val;
4125 }
4126 
4127 /* Relocate an Alpha ELF section.  */
4128 
4129 static bfd_boolean
4130 elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4131 			      bfd *input_bfd, asection *input_section,
4132 			      bfd_byte *contents, Elf_Internal_Rela *relocs,
4133 			      Elf_Internal_Sym *local_syms,
4134 			      asection **local_sections)
4135 {
4136   Elf_Internal_Shdr *symtab_hdr;
4137   Elf_Internal_Rela *rel;
4138   Elf_Internal_Rela *relend;
4139   asection *sgot, *srel, *srelgot;
4140   bfd *dynobj, *gotobj;
4141   bfd_vma gp, tp_base, dtp_base;
4142   struct alpha_elf_got_entry **local_got_entries;
4143   bfd_boolean ret_val;
4144 
4145   BFD_ASSERT (is_alpha_elf (input_bfd));
4146 
4147   /* Handle relocatable links with a smaller loop.  */
4148   if (info->relocatable)
4149     return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4150 					   input_section, contents, relocs,
4151 					   local_syms, local_sections);
4152 
4153   /* This is a final link.  */
4154 
4155   ret_val = TRUE;
4156 
4157   symtab_hdr = &elf_symtab_hdr (input_bfd);
4158 
4159   dynobj = elf_hash_table (info)->dynobj;
4160   if (dynobj)
4161     srelgot = bfd_get_linker_section (dynobj, ".rela.got");
4162   else
4163     srelgot = NULL;
4164 
4165   if (input_section->flags & SEC_ALLOC)
4166     {
4167       const char *section_name;
4168       section_name = (bfd_elf_string_from_elf_section
4169 		      (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4170 		       _bfd_elf_single_rel_hdr (input_section)->sh_name));
4171       BFD_ASSERT(section_name != NULL);
4172       srel = bfd_get_linker_section (dynobj, section_name);
4173     }
4174   else
4175     srel = NULL;
4176 
4177   /* Find the gp value for this input bfd.  */
4178   gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4179   if (gotobj)
4180     {
4181       sgot = alpha_elf_tdata (gotobj)->got;
4182       gp = _bfd_get_gp_value (gotobj);
4183       if (gp == 0)
4184 	{
4185 	  gp = (sgot->output_section->vma
4186 		+ sgot->output_offset
4187 		+ 0x8000);
4188 	  _bfd_set_gp_value (gotobj, gp);
4189 	}
4190     }
4191   else
4192     {
4193       sgot = NULL;
4194       gp = 0;
4195     }
4196 
4197   local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4198 
4199   if (elf_hash_table (info)->tls_sec != NULL)
4200     {
4201       dtp_base = alpha_get_dtprel_base (info);
4202       tp_base = alpha_get_tprel_base (info);
4203     }
4204   else
4205     dtp_base = tp_base = 0;
4206 
4207   relend = relocs + input_section->reloc_count;
4208   for (rel = relocs; rel < relend; rel++)
4209     {
4210       struct alpha_elf_link_hash_entry *h = NULL;
4211       struct alpha_elf_got_entry *gotent;
4212       bfd_reloc_status_type r;
4213       reloc_howto_type *howto;
4214       unsigned long r_symndx;
4215       Elf_Internal_Sym *sym = NULL;
4216       asection *sec = NULL;
4217       bfd_vma value;
4218       bfd_vma addend;
4219       bfd_boolean dynamic_symbol_p;
4220       bfd_boolean unresolved_reloc = FALSE;
4221       bfd_boolean undef_weak_ref = FALSE;
4222       unsigned long r_type;
4223 
4224       r_type = ELF64_R_TYPE(rel->r_info);
4225       if (r_type >= R_ALPHA_max)
4226 	{
4227 	  (*_bfd_error_handler)
4228 	    (_("%B: unknown relocation type %d"),
4229 	     input_bfd, (int) r_type);
4230 	  bfd_set_error (bfd_error_bad_value);
4231 	  ret_val = FALSE;
4232 	  continue;
4233 	}
4234 
4235       howto = elf64_alpha_howto_table + r_type;
4236       r_symndx = ELF64_R_SYM(rel->r_info);
4237 
4238       /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4239 	 reloc to the STN_UNDEF (0) symbol so that they all match.  */
4240       if (r_type == R_ALPHA_TLSLDM)
4241 	r_symndx = STN_UNDEF;
4242 
4243       if (r_symndx < symtab_hdr->sh_info)
4244 	{
4245 	  asection *msec;
4246 	  sym = local_syms + r_symndx;
4247 	  sec = local_sections[r_symndx];
4248 	  msec = sec;
4249 	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4250 
4251 	  /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4252 	     this is hackery from relax_section.  Force the value to
4253 	     be the tls module base.  */
4254 	  if (r_symndx == STN_UNDEF
4255 	      && (r_type == R_ALPHA_TLSLDM
4256 		  || r_type == R_ALPHA_GOTTPREL
4257 		  || r_type == R_ALPHA_TPREL64
4258 		  || r_type == R_ALPHA_TPRELHI
4259 		  || r_type == R_ALPHA_TPRELLO
4260 		  || r_type == R_ALPHA_TPREL16))
4261 	    value = dtp_base;
4262 
4263 	  if (local_got_entries)
4264 	    gotent = local_got_entries[r_symndx];
4265 	  else
4266 	    gotent = NULL;
4267 
4268 	  /* Need to adjust local GOT entries' addends for SEC_MERGE
4269 	     unless it has been done already.  */
4270 	  if ((sec->flags & SEC_MERGE)
4271 	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4272 	      && sec->sec_info_type == SEC_INFO_TYPE_MERGE
4273 	      && gotent
4274 	      && !gotent->reloc_xlated)
4275 	    {
4276 	      struct alpha_elf_got_entry *ent;
4277 
4278 	      for (ent = gotent; ent; ent = ent->next)
4279 		{
4280 		  ent->reloc_xlated = 1;
4281 		  if (ent->use_count == 0)
4282 		    continue;
4283 		  msec = sec;
4284 		  ent->addend =
4285 		    _bfd_merged_section_offset (output_bfd, &msec,
4286 						elf_section_data (sec)->
4287 						  sec_info,
4288 						sym->st_value + ent->addend);
4289 		  ent->addend -= sym->st_value;
4290 		  ent->addend += msec->output_section->vma
4291 				 + msec->output_offset
4292 				 - sec->output_section->vma
4293 				 - sec->output_offset;
4294 		}
4295 	    }
4296 
4297 	  dynamic_symbol_p = FALSE;
4298 	}
4299       else
4300 	{
4301 	  bfd_boolean warned;
4302 	  struct elf_link_hash_entry *hh;
4303 	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4304 
4305 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4306 				   r_symndx, symtab_hdr, sym_hashes,
4307 				   hh, sec, value,
4308 				   unresolved_reloc, warned);
4309 
4310 	  if (warned)
4311 	    continue;
4312 
4313 	  if (value == 0
4314 	      && ! unresolved_reloc
4315 	      && hh->root.type == bfd_link_hash_undefweak)
4316 	    undef_weak_ref = TRUE;
4317 
4318 	  h = (struct alpha_elf_link_hash_entry *) hh;
4319           dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4320 	  gotent = h->got_entries;
4321 	}
4322 
4323       if (sec != NULL && discarded_section (sec))
4324 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4325 					 rel, 1, relend, howto, 0, contents);
4326 
4327       addend = rel->r_addend;
4328       value += addend;
4329 
4330       /* Search for the proper got entry.  */
4331       for (; gotent ; gotent = gotent->next)
4332 	if (gotent->gotobj == gotobj
4333 	    && gotent->reloc_type == r_type
4334 	    && gotent->addend == addend)
4335 	  break;
4336 
4337       switch (r_type)
4338 	{
4339 	case R_ALPHA_GPDISP:
4340 	  {
4341 	    bfd_byte *p_ldah, *p_lda;
4342 
4343 	    BFD_ASSERT(gp != 0);
4344 
4345 	    value = (input_section->output_section->vma
4346 		     + input_section->output_offset
4347 		     + rel->r_offset);
4348 
4349 	    p_ldah = contents + rel->r_offset;
4350 	    p_lda = p_ldah + rel->r_addend;
4351 
4352 	    r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4353 					     p_ldah, p_lda);
4354 	  }
4355 	  break;
4356 
4357 	case R_ALPHA_LITERAL:
4358 	  BFD_ASSERT(sgot != NULL);
4359 	  BFD_ASSERT(gp != 0);
4360 	  BFD_ASSERT(gotent != NULL);
4361 	  BFD_ASSERT(gotent->use_count >= 1);
4362 
4363 	  if (!gotent->reloc_done)
4364 	    {
4365 	      gotent->reloc_done = 1;
4366 
4367 	      bfd_put_64 (output_bfd, value,
4368 			  sgot->contents + gotent->got_offset);
4369 
4370 	      /* If the symbol has been forced local, output a
4371 		 RELATIVE reloc, otherwise it will be handled in
4372 		 finish_dynamic_symbol.  */
4373 	      if (info->shared && !dynamic_symbol_p && !undef_weak_ref)
4374 		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4375 					 gotent->got_offset, 0,
4376 					 R_ALPHA_RELATIVE, value);
4377 	    }
4378 
4379 	  value = (sgot->output_section->vma
4380 		   + sgot->output_offset
4381 		   + gotent->got_offset);
4382 	  value -= gp;
4383 	  goto default_reloc;
4384 
4385 	case R_ALPHA_GPREL32:
4386 	case R_ALPHA_GPREL16:
4387 	case R_ALPHA_GPRELLOW:
4388 	  if (dynamic_symbol_p)
4389             {
4390               (*_bfd_error_handler)
4391                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4392                  input_bfd, h->root.root.root.string);
4393               ret_val = FALSE;
4394             }
4395 	  BFD_ASSERT(gp != 0);
4396 	  value -= gp;
4397 	  goto default_reloc;
4398 
4399 	case R_ALPHA_GPRELHIGH:
4400 	  if (dynamic_symbol_p)
4401             {
4402               (*_bfd_error_handler)
4403                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4404                  input_bfd, h->root.root.root.string);
4405               ret_val = FALSE;
4406             }
4407 	  BFD_ASSERT(gp != 0);
4408 	  value -= gp;
4409 	  value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4410 	  goto default_reloc;
4411 
4412 	case R_ALPHA_HINT:
4413 	  /* A call to a dynamic symbol is definitely out of range of
4414 	     the 16-bit displacement.  Don't bother writing anything.  */
4415 	  if (dynamic_symbol_p)
4416 	    {
4417 	      r = bfd_reloc_ok;
4418 	      break;
4419 	    }
4420 	  /* The regular PC-relative stuff measures from the start of
4421 	     the instruction rather than the end.  */
4422 	  value -= 4;
4423 	  goto default_reloc;
4424 
4425 	case R_ALPHA_BRADDR:
4426 	  if (dynamic_symbol_p)
4427             {
4428               (*_bfd_error_handler)
4429                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4430                  input_bfd, h->root.root.root.string);
4431               ret_val = FALSE;
4432             }
4433 	  /* The regular PC-relative stuff measures from the start of
4434 	     the instruction rather than the end.  */
4435 	  value -= 4;
4436 	  goto default_reloc;
4437 
4438 	case R_ALPHA_BRSGP:
4439 	  {
4440 	    int other;
4441 	    const char *name;
4442 
4443 	    /* The regular PC-relative stuff measures from the start of
4444 	       the instruction rather than the end.  */
4445 	    value -= 4;
4446 
4447 	    /* The source and destination gp must be the same.  Note that
4448 	       the source will always have an assigned gp, since we forced
4449 	       one in check_relocs, but that the destination may not, as
4450 	       it might not have had any relocations at all.  Also take
4451 	       care not to crash if H is an undefined symbol.  */
4452 	    if (h != NULL && sec != NULL
4453 		&& alpha_elf_tdata (sec->owner)->gotobj
4454 		&& gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4455 	      {
4456 		(*_bfd_error_handler)
4457 		  (_("%B: change in gp: BRSGP %s"),
4458 		   input_bfd, h->root.root.root.string);
4459 		ret_val = FALSE;
4460 	      }
4461 
4462 	    /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4463 	    if (h != NULL)
4464 	      other = h->root.other;
4465 	    else
4466 	      other = sym->st_other;
4467 	    switch (other & STO_ALPHA_STD_GPLOAD)
4468 	      {
4469 	      case STO_ALPHA_NOPV:
4470 	        break;
4471 	      case STO_ALPHA_STD_GPLOAD:
4472 		value += 8;
4473 		break;
4474 	      default:
4475 		if (h != NULL)
4476 		  name = h->root.root.root.string;
4477 		else
4478 		  {
4479 		    name = (bfd_elf_string_from_elf_section
4480 			    (input_bfd, symtab_hdr->sh_link, sym->st_name));
4481 		    if (name == NULL)
4482 		      name = _("<unknown>");
4483 		    else if (name[0] == 0)
4484 		      name = bfd_section_name (input_bfd, sec);
4485 		  }
4486 		(*_bfd_error_handler)
4487 		  (_("%B: !samegp reloc against symbol without .prologue: %s"),
4488 		   input_bfd, name);
4489 		ret_val = FALSE;
4490 		break;
4491 	      }
4492 
4493 	    goto default_reloc;
4494 	  }
4495 
4496 	case R_ALPHA_REFLONG:
4497 	case R_ALPHA_REFQUAD:
4498 	case R_ALPHA_DTPREL64:
4499 	case R_ALPHA_TPREL64:
4500 	  {
4501 	    long dynindx, dyntype = r_type;
4502 	    bfd_vma dynaddend;
4503 
4504 	    /* Careful here to remember RELATIVE relocations for global
4505 	       variables for symbolic shared objects.  */
4506 
4507 	    if (dynamic_symbol_p)
4508 	      {
4509 		BFD_ASSERT(h->root.dynindx != -1);
4510 		dynindx = h->root.dynindx;
4511 		dynaddend = addend;
4512 		addend = 0, value = 0;
4513 	      }
4514 	    else if (r_type == R_ALPHA_DTPREL64)
4515 	      {
4516 		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4517 		value -= dtp_base;
4518 		goto default_reloc;
4519 	      }
4520 	    else if (r_type == R_ALPHA_TPREL64)
4521 	      {
4522 		BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4523 		if (!info->shared || info->pie)
4524 		  {
4525 		    value -= tp_base;
4526 		    goto default_reloc;
4527 		  }
4528 		dynindx = 0;
4529 		dynaddend = value - dtp_base;
4530 	      }
4531 	    else if (info->shared
4532 		     && r_symndx != STN_UNDEF
4533 		     && (input_section->flags & SEC_ALLOC)
4534 		     && !undef_weak_ref
4535 		     && !(unresolved_reloc
4536 			  && (_bfd_elf_section_offset (output_bfd, info,
4537 						       input_section,
4538 						       rel->r_offset)
4539 			      == (bfd_vma) -1)))
4540 	      {
4541 		if (r_type == R_ALPHA_REFLONG)
4542 		  {
4543 		    (*_bfd_error_handler)
4544 		      (_("%B: unhandled dynamic relocation against %s"),
4545 		       input_bfd,
4546 		       h->root.root.root.string);
4547 		    ret_val = FALSE;
4548 		  }
4549 		dynindx = 0;
4550 		dyntype = R_ALPHA_RELATIVE;
4551 		dynaddend = value;
4552 	      }
4553 	    else
4554 	      goto default_reloc;
4555 
4556 	    if (input_section->flags & SEC_ALLOC)
4557 	      elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4558 				       srel, rel->r_offset, dynindx,
4559 				       dyntype, dynaddend);
4560 	  }
4561 	  goto default_reloc;
4562 
4563 	case R_ALPHA_SREL16:
4564 	case R_ALPHA_SREL32:
4565 	case R_ALPHA_SREL64:
4566 	  if (dynamic_symbol_p)
4567             {
4568               (*_bfd_error_handler)
4569                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4570                  input_bfd, h->root.root.root.string);
4571               ret_val = FALSE;
4572             }
4573 	  else if ((info->shared || info->pie) && undef_weak_ref)
4574             {
4575               (*_bfd_error_handler)
4576                 (_("%B: pc-relative relocation against undefined weak symbol %s"),
4577                  input_bfd, h->root.root.root.string);
4578               ret_val = FALSE;
4579             }
4580 
4581 
4582 	  /* ??? .eh_frame references to discarded sections will be smashed
4583 	     to relocations against SHN_UNDEF.  The .eh_frame format allows
4584 	     NULL to be encoded as 0 in any format, so this works here.  */
4585 	  if (r_symndx == STN_UNDEF
4586 	      || (unresolved_reloc
4587 		  && _bfd_elf_section_offset (output_bfd, info,
4588 					      input_section,
4589 					      rel->r_offset) == (bfd_vma) -1))
4590 	    howto = (elf64_alpha_howto_table
4591 		     + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4592 	  goto default_reloc;
4593 
4594 	case R_ALPHA_TLSLDM:
4595 	  /* Ignore the symbol for the relocation.  The result is always
4596 	     the current module.  */
4597 	  dynamic_symbol_p = 0;
4598 	  /* FALLTHRU */
4599 
4600 	case R_ALPHA_TLSGD:
4601 	  if (!gotent->reloc_done)
4602 	    {
4603 	      gotent->reloc_done = 1;
4604 
4605 	      /* Note that the module index for the main program is 1.  */
4606 	      bfd_put_64 (output_bfd, !info->shared && !dynamic_symbol_p,
4607 			  sgot->contents + gotent->got_offset);
4608 
4609 	      /* If the symbol has been forced local, output a
4610 		 DTPMOD64 reloc, otherwise it will be handled in
4611 		 finish_dynamic_symbol.  */
4612 	      if (info->shared && !dynamic_symbol_p)
4613 		elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4614 					 gotent->got_offset, 0,
4615 					 R_ALPHA_DTPMOD64, 0);
4616 
4617 	      if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4618 		value = 0;
4619 	      else
4620 		{
4621 		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4622 	          value -= dtp_base;
4623 		}
4624 	      bfd_put_64 (output_bfd, value,
4625 			  sgot->contents + gotent->got_offset + 8);
4626 	    }
4627 
4628 	  value = (sgot->output_section->vma
4629 		   + sgot->output_offset
4630 		   + gotent->got_offset);
4631 	  value -= gp;
4632 	  goto default_reloc;
4633 
4634 	case R_ALPHA_DTPRELHI:
4635 	case R_ALPHA_DTPRELLO:
4636 	case R_ALPHA_DTPREL16:
4637 	  if (dynamic_symbol_p)
4638             {
4639               (*_bfd_error_handler)
4640                 (_("%B: dtp-relative relocation against dynamic symbol %s"),
4641                  input_bfd, h->root.root.root.string);
4642               ret_val = FALSE;
4643             }
4644 	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4645 	  value -= dtp_base;
4646 	  if (r_type == R_ALPHA_DTPRELHI)
4647 	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4648 	  goto default_reloc;
4649 
4650 	case R_ALPHA_TPRELHI:
4651 	case R_ALPHA_TPRELLO:
4652 	case R_ALPHA_TPREL16:
4653 	  if (info->shared && !info->pie)
4654 	    {
4655 	      (*_bfd_error_handler)
4656 		(_("%B: TLS local exec code cannot be linked into shared objects"),
4657 		input_bfd);
4658               ret_val = FALSE;
4659 	    }
4660 	  else if (dynamic_symbol_p)
4661             {
4662               (*_bfd_error_handler)
4663                 (_("%B: tp-relative relocation against dynamic symbol %s"),
4664                  input_bfd, h->root.root.root.string);
4665               ret_val = FALSE;
4666             }
4667 	  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4668 	  value -= tp_base;
4669 	  if (r_type == R_ALPHA_TPRELHI)
4670 	    value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4671 	  goto default_reloc;
4672 
4673 	case R_ALPHA_GOTDTPREL:
4674 	case R_ALPHA_GOTTPREL:
4675 	  BFD_ASSERT(sgot != NULL);
4676 	  BFD_ASSERT(gp != 0);
4677 	  BFD_ASSERT(gotent != NULL);
4678 	  BFD_ASSERT(gotent->use_count >= 1);
4679 
4680 	  if (!gotent->reloc_done)
4681 	    {
4682 	      gotent->reloc_done = 1;
4683 
4684 	      if (dynamic_symbol_p)
4685 		value = 0;
4686 	      else
4687 		{
4688 		  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4689 		  if (r_type == R_ALPHA_GOTDTPREL)
4690 		    value -= dtp_base;
4691 		  else if (!info->shared)
4692 		    value -= tp_base;
4693 		  else
4694 		    {
4695 		      elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4696 					       gotent->got_offset, 0,
4697 					       R_ALPHA_TPREL64,
4698 					       value - dtp_base);
4699 		      value = 0;
4700 		    }
4701 		}
4702 	      bfd_put_64 (output_bfd, value,
4703 			  sgot->contents + gotent->got_offset);
4704 	    }
4705 
4706 	  value = (sgot->output_section->vma
4707 		   + sgot->output_offset
4708 		   + gotent->got_offset);
4709 	  value -= gp;
4710 	  goto default_reloc;
4711 
4712 	default:
4713 	default_reloc:
4714 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4715 					contents, rel->r_offset, value, 0);
4716 	  break;
4717 	}
4718 
4719       switch (r)
4720 	{
4721 	case bfd_reloc_ok:
4722 	  break;
4723 
4724 	case bfd_reloc_overflow:
4725 	  {
4726 	    const char *name;
4727 
4728 	    /* Don't warn if the overflow is due to pc relative reloc
4729 	       against discarded section.  Section optimization code should
4730 	       handle it.  */
4731 
4732 	    if (r_symndx < symtab_hdr->sh_info
4733 		&& sec != NULL && howto->pc_relative
4734 		&& discarded_section (sec))
4735 	      break;
4736 
4737 	    if (h != NULL)
4738 	      name = NULL;
4739 	    else
4740 	      {
4741 		name = (bfd_elf_string_from_elf_section
4742 			(input_bfd, symtab_hdr->sh_link, sym->st_name));
4743 		if (name == NULL)
4744 		  return FALSE;
4745 		if (*name == '\0')
4746 		  name = bfd_section_name (input_bfd, sec);
4747 	      }
4748 	    if (! ((*info->callbacks->reloc_overflow)
4749 		   (info, (h ? &h->root.root : NULL), name, howto->name,
4750 		    (bfd_vma) 0, input_bfd, input_section,
4751 		    rel->r_offset)))
4752 	      ret_val = FALSE;
4753 	  }
4754 	  break;
4755 
4756 	default:
4757 	case bfd_reloc_outofrange:
4758 	  abort ();
4759 	}
4760     }
4761 
4762   return ret_val;
4763 }
4764 
4765 /* Finish up dynamic symbol handling.  We set the contents of various
4766    dynamic sections here.  */
4767 
4768 static bfd_boolean
4769 elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4770 				   struct elf_link_hash_entry *h,
4771 				   Elf_Internal_Sym *sym)
4772 {
4773   struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4774   bfd *dynobj = elf_hash_table(info)->dynobj;
4775 
4776   if (h->needs_plt)
4777     {
4778       /* Fill in the .plt entry for this symbol.  */
4779       asection *splt, *sgot, *srel;
4780       Elf_Internal_Rela outrel;
4781       bfd_byte *loc;
4782       bfd_vma got_addr, plt_addr;
4783       bfd_vma plt_index;
4784       struct alpha_elf_got_entry *gotent;
4785 
4786       BFD_ASSERT (h->dynindx != -1);
4787 
4788       splt = bfd_get_linker_section (dynobj, ".plt");
4789       BFD_ASSERT (splt != NULL);
4790       srel = bfd_get_linker_section (dynobj, ".rela.plt");
4791       BFD_ASSERT (srel != NULL);
4792 
4793       for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4794 	if (gotent->reloc_type == R_ALPHA_LITERAL
4795 	    && gotent->use_count > 0)
4796 	  {
4797 	    unsigned int insn;
4798 	    int disp;
4799 
4800 	    sgot = alpha_elf_tdata (gotent->gotobj)->got;
4801 	    BFD_ASSERT (sgot != NULL);
4802 
4803 	    BFD_ASSERT (gotent->got_offset != -1);
4804 	    BFD_ASSERT (gotent->plt_offset != -1);
4805 
4806 	    got_addr = (sgot->output_section->vma
4807 			+ sgot->output_offset
4808 			+ gotent->got_offset);
4809 	    plt_addr = (splt->output_section->vma
4810 			+ splt->output_offset
4811 			+ gotent->plt_offset);
4812 
4813 	    plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4814 
4815 	    /* Fill in the entry in the procedure linkage table.  */
4816 	    if (elf64_alpha_use_secureplt)
4817 	      {
4818 		disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4819 		insn = INSN_AD (INSN_BR, 31, disp);
4820 		bfd_put_32 (output_bfd, insn,
4821 			    splt->contents + gotent->plt_offset);
4822 
4823 		plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4824 			     / NEW_PLT_ENTRY_SIZE);
4825 	      }
4826 	    else
4827 	      {
4828 		disp = -(gotent->plt_offset + 4);
4829 		insn = INSN_AD (INSN_BR, 28, disp);
4830 		bfd_put_32 (output_bfd, insn,
4831 			    splt->contents + gotent->plt_offset);
4832 		bfd_put_32 (output_bfd, INSN_UNOP,
4833 			    splt->contents + gotent->plt_offset + 4);
4834 		bfd_put_32 (output_bfd, INSN_UNOP,
4835 			    splt->contents + gotent->plt_offset + 8);
4836 
4837 		plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4838 			     / OLD_PLT_ENTRY_SIZE);
4839 	      }
4840 
4841 	    /* Fill in the entry in the .rela.plt section.  */
4842 	    outrel.r_offset = got_addr;
4843 	    outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4844 	    outrel.r_addend = 0;
4845 
4846 	    loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4847 	    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4848 
4849 	    /* Fill in the entry in the .got.  */
4850 	    bfd_put_64 (output_bfd, plt_addr,
4851 			sgot->contents + gotent->got_offset);
4852 	  }
4853     }
4854   else if (alpha_elf_dynamic_symbol_p (h, info))
4855     {
4856       /* Fill in the dynamic relocations for this symbol's .got entries.  */
4857       asection *srel;
4858       struct alpha_elf_got_entry *gotent;
4859 
4860       srel = bfd_get_linker_section (dynobj, ".rela.got");
4861       BFD_ASSERT (srel != NULL);
4862 
4863       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4864 	   gotent != NULL;
4865 	   gotent = gotent->next)
4866 	{
4867 	  asection *sgot;
4868 	  long r_type;
4869 
4870 	  if (gotent->use_count == 0)
4871 	    continue;
4872 
4873 	  sgot = alpha_elf_tdata (gotent->gotobj)->got;
4874 
4875 	  r_type = gotent->reloc_type;
4876 	  switch (r_type)
4877 	    {
4878 	    case R_ALPHA_LITERAL:
4879 	      r_type = R_ALPHA_GLOB_DAT;
4880 	      break;
4881 	    case R_ALPHA_TLSGD:
4882 	      r_type = R_ALPHA_DTPMOD64;
4883 	      break;
4884 	    case R_ALPHA_GOTDTPREL:
4885 	      r_type = R_ALPHA_DTPREL64;
4886 	      break;
4887 	    case R_ALPHA_GOTTPREL:
4888 	      r_type = R_ALPHA_TPREL64;
4889 	      break;
4890 	    case R_ALPHA_TLSLDM:
4891 	    default:
4892 	      abort ();
4893 	    }
4894 
4895 	  elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4896 				   gotent->got_offset, h->dynindx,
4897 				   r_type, gotent->addend);
4898 
4899 	  if (gotent->reloc_type == R_ALPHA_TLSGD)
4900 	    elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4901 				     gotent->got_offset + 8, h->dynindx,
4902 				     R_ALPHA_DTPREL64, gotent->addend);
4903 	}
4904     }
4905 
4906   /* Mark some specially defined symbols as absolute.  */
4907   if (h == elf_hash_table (info)->hdynamic
4908       || h == elf_hash_table (info)->hgot
4909       || h == elf_hash_table (info)->hplt)
4910     sym->st_shndx = SHN_ABS;
4911 
4912   return TRUE;
4913 }
4914 
4915 /* Finish up the dynamic sections.  */
4916 
4917 static bfd_boolean
4918 elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4919 				     struct bfd_link_info *info)
4920 {
4921   bfd *dynobj;
4922   asection *sdyn;
4923 
4924   dynobj = elf_hash_table (info)->dynobj;
4925   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4926 
4927   if (elf_hash_table (info)->dynamic_sections_created)
4928     {
4929       asection *splt, *sgotplt, *srelaplt;
4930       Elf64_External_Dyn *dyncon, *dynconend;
4931       bfd_vma plt_vma, gotplt_vma;
4932 
4933       splt = bfd_get_linker_section (dynobj, ".plt");
4934       srelaplt = bfd_get_linker_section (output_bfd, ".rela.plt");
4935       BFD_ASSERT (splt != NULL && sdyn != NULL);
4936 
4937       plt_vma = splt->output_section->vma + splt->output_offset;
4938 
4939       gotplt_vma = 0;
4940       if (elf64_alpha_use_secureplt)
4941 	{
4942 	  sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
4943 	  BFD_ASSERT (sgotplt != NULL);
4944 	  if (sgotplt->size > 0)
4945 	    gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4946 	}
4947 
4948       dyncon = (Elf64_External_Dyn *) sdyn->contents;
4949       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4950       for (; dyncon < dynconend; dyncon++)
4951 	{
4952 	  Elf_Internal_Dyn dyn;
4953 
4954 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4955 
4956 	  switch (dyn.d_tag)
4957 	    {
4958 	    case DT_PLTGOT:
4959 	      dyn.d_un.d_ptr
4960 		= elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4961 	      break;
4962 	    case DT_PLTRELSZ:
4963 	      dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
4964 	      break;
4965 	    case DT_JMPREL:
4966 	      dyn.d_un.d_ptr = srelaplt ? srelaplt->vma : 0;
4967 	      break;
4968 
4969 	    case DT_RELASZ:
4970 	      /* My interpretation of the TIS v1.1 ELF document indicates
4971 		 that RELASZ should not include JMPREL.  This is not what
4972 		 the rest of the BFD does.  It is, however, what the
4973 		 glibc ld.so wants.  Do this fixup here until we found
4974 		 out who is right.  */
4975 	      if (srelaplt)
4976 		dyn.d_un.d_val -= srelaplt->size;
4977 	      break;
4978 	    }
4979 
4980 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
4981 	}
4982 
4983       /* Initialize the plt header.  */
4984       if (splt->size > 0)
4985 	{
4986 	  unsigned int insn;
4987 	  int ofs;
4988 
4989 	  if (elf64_alpha_use_secureplt)
4990 	    {
4991 	      ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
4992 
4993 	      insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
4994 	      bfd_put_32 (output_bfd, insn, splt->contents);
4995 
4996 	      insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
4997 	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
4998 
4999 	      insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
5000 	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5001 
5002 	      insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
5003 	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5004 
5005 	      insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
5006 	      bfd_put_32 (output_bfd, insn, splt->contents + 16);
5007 
5008 	      insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
5009 	      bfd_put_32 (output_bfd, insn, splt->contents + 20);
5010 
5011 	      insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
5012 	      bfd_put_32 (output_bfd, insn, splt->contents + 24);
5013 
5014 	      insn = INSN_AB (INSN_JMP, 31, 27);
5015 	      bfd_put_32 (output_bfd, insn, splt->contents + 28);
5016 
5017 	      insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
5018 	      bfd_put_32 (output_bfd, insn, splt->contents + 32);
5019 	    }
5020 	  else
5021 	    {
5022 	      insn = INSN_AD (INSN_BR, 27, 0);	/* br $27, .+4 */
5023 	      bfd_put_32 (output_bfd, insn, splt->contents);
5024 
5025 	      insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5026 	      bfd_put_32 (output_bfd, insn, splt->contents + 4);
5027 
5028 	      insn = INSN_UNOP;
5029 	      bfd_put_32 (output_bfd, insn, splt->contents + 8);
5030 
5031 	      insn = INSN_AB (INSN_JMP, 27, 27);
5032 	      bfd_put_32 (output_bfd, insn, splt->contents + 12);
5033 
5034 	      /* The next two words will be filled in by ld.so.  */
5035 	      bfd_put_64 (output_bfd, 0, splt->contents + 16);
5036 	      bfd_put_64 (output_bfd, 0, splt->contents + 24);
5037 	    }
5038 
5039 	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5040 	}
5041     }
5042 
5043   return TRUE;
5044 }
5045 
5046 /* We need to use a special link routine to handle the .mdebug section.
5047    We need to merge all instances of these sections together, not write
5048    them all out sequentially.  */
5049 
5050 static bfd_boolean
5051 elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5052 {
5053   asection *o;
5054   struct bfd_link_order *p;
5055   asection *mdebug_sec;
5056   struct ecoff_debug_info debug;
5057   const struct ecoff_debug_swap *swap
5058     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5059   HDRR *symhdr = &debug.symbolic_header;
5060   void * mdebug_handle = NULL;
5061   struct alpha_elf_link_hash_table * htab;
5062 
5063   htab = alpha_elf_hash_table (info);
5064   if (htab == NULL)
5065     return FALSE;
5066 
5067   /* Go through the sections and collect the mdebug information.  */
5068   mdebug_sec = NULL;
5069   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5070     {
5071       if (strcmp (o->name, ".mdebug") == 0)
5072 	{
5073 	  struct extsym_info einfo;
5074 
5075 	  /* We have found the .mdebug section in the output file.
5076 	     Look through all the link_orders comprising it and merge
5077 	     the information together.  */
5078 	  symhdr->magic = swap->sym_magic;
5079 	  /* FIXME: What should the version stamp be?  */
5080 	  symhdr->vstamp = 0;
5081 	  symhdr->ilineMax = 0;
5082 	  symhdr->cbLine = 0;
5083 	  symhdr->idnMax = 0;
5084 	  symhdr->ipdMax = 0;
5085 	  symhdr->isymMax = 0;
5086 	  symhdr->ioptMax = 0;
5087 	  symhdr->iauxMax = 0;
5088 	  symhdr->issMax = 0;
5089 	  symhdr->issExtMax = 0;
5090 	  symhdr->ifdMax = 0;
5091 	  symhdr->crfd = 0;
5092 	  symhdr->iextMax = 0;
5093 
5094 	  /* We accumulate the debugging information itself in the
5095 	     debug_info structure.  */
5096 	  debug.line = NULL;
5097 	  debug.external_dnr = NULL;
5098 	  debug.external_pdr = NULL;
5099 	  debug.external_sym = NULL;
5100 	  debug.external_opt = NULL;
5101 	  debug.external_aux = NULL;
5102 	  debug.ss = NULL;
5103 	  debug.ssext = debug.ssext_end = NULL;
5104 	  debug.external_fdr = NULL;
5105 	  debug.external_rfd = NULL;
5106 	  debug.external_ext = debug.external_ext_end = NULL;
5107 
5108 	  mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5109 	  if (mdebug_handle == NULL)
5110 	    return FALSE;
5111 
5112 	  if (1)
5113 	    {
5114 	      asection *s;
5115 	      EXTR esym;
5116 	      bfd_vma last = 0;
5117 	      unsigned int i;
5118 	      static const char * const name[] =
5119 		{
5120 		  ".text", ".init", ".fini", ".data",
5121 		  ".rodata", ".sdata", ".sbss", ".bss"
5122 		};
5123 	      static const int sc[] = { scText, scInit, scFini, scData,
5124 					  scRData, scSData, scSBss, scBss };
5125 
5126 	      esym.jmptbl = 0;
5127 	      esym.cobol_main = 0;
5128 	      esym.weakext = 0;
5129 	      esym.reserved = 0;
5130 	      esym.ifd = ifdNil;
5131 	      esym.asym.iss = issNil;
5132 	      esym.asym.st = stLocal;
5133 	      esym.asym.reserved = 0;
5134 	      esym.asym.index = indexNil;
5135 	      for (i = 0; i < 8; i++)
5136 		{
5137 		  esym.asym.sc = sc[i];
5138 		  s = bfd_get_section_by_name (abfd, name[i]);
5139 		  if (s != NULL)
5140 		    {
5141 		      esym.asym.value = s->vma;
5142 		      last = s->vma + s->size;
5143 		    }
5144 		  else
5145 		    esym.asym.value = last;
5146 
5147 		  if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5148 						      name[i], &esym))
5149 		    return FALSE;
5150 		}
5151 	    }
5152 
5153 	  for (p = o->map_head.link_order;
5154 	       p != (struct bfd_link_order *) NULL;
5155 	       p = p->next)
5156 	    {
5157 	      asection *input_section;
5158 	      bfd *input_bfd;
5159 	      const struct ecoff_debug_swap *input_swap;
5160 	      struct ecoff_debug_info input_debug;
5161 	      char *eraw_src;
5162 	      char *eraw_end;
5163 
5164 	      if (p->type != bfd_indirect_link_order)
5165 		{
5166 		  if (p->type == bfd_data_link_order)
5167 		    continue;
5168 		  abort ();
5169 		}
5170 
5171 	      input_section = p->u.indirect.section;
5172 	      input_bfd = input_section->owner;
5173 
5174 	      if (! is_alpha_elf (input_bfd))
5175 		/* I don't know what a non ALPHA ELF bfd would be
5176 		   doing with a .mdebug section, but I don't really
5177 		   want to deal with it.  */
5178 		continue;
5179 
5180 	      input_swap = (get_elf_backend_data (input_bfd)
5181 			    ->elf_backend_ecoff_debug_swap);
5182 
5183 	      BFD_ASSERT (p->size == input_section->size);
5184 
5185 	      /* The ECOFF linking code expects that we have already
5186 		 read in the debugging information and set up an
5187 		 ecoff_debug_info structure, so we do that now.  */
5188 	      if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5189 						&input_debug))
5190 		return FALSE;
5191 
5192 	      if (! (bfd_ecoff_debug_accumulate
5193 		     (mdebug_handle, abfd, &debug, swap, input_bfd,
5194 		      &input_debug, input_swap, info)))
5195 		return FALSE;
5196 
5197 	      /* Loop through the external symbols.  For each one with
5198 		 interesting information, try to find the symbol in
5199 		 the linker global hash table and save the information
5200 		 for the output external symbols.  */
5201 	      eraw_src = (char *) input_debug.external_ext;
5202 	      eraw_end = (eraw_src
5203 			  + (input_debug.symbolic_header.iextMax
5204 			     * input_swap->external_ext_size));
5205 	      for (;
5206 		   eraw_src < eraw_end;
5207 		   eraw_src += input_swap->external_ext_size)
5208 		{
5209 		  EXTR ext;
5210 		  const char *name;
5211 		  struct alpha_elf_link_hash_entry *h;
5212 
5213 		  (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
5214 		  if (ext.asym.sc == scNil
5215 		      || ext.asym.sc == scUndefined
5216 		      || ext.asym.sc == scSUndefined)
5217 		    continue;
5218 
5219 		  name = input_debug.ssext + ext.asym.iss;
5220 		  h = alpha_elf_link_hash_lookup (htab, name, FALSE, FALSE, TRUE);
5221 		  if (h == NULL || h->esym.ifd != -2)
5222 		    continue;
5223 
5224 		  if (ext.ifd != -1)
5225 		    {
5226 		      BFD_ASSERT (ext.ifd
5227 				  < input_debug.symbolic_header.ifdMax);
5228 		      ext.ifd = input_debug.ifdmap[ext.ifd];
5229 		    }
5230 
5231 		  h->esym = ext;
5232 		}
5233 
5234 	      /* Free up the information we just read.  */
5235 	      free (input_debug.line);
5236 	      free (input_debug.external_dnr);
5237 	      free (input_debug.external_pdr);
5238 	      free (input_debug.external_sym);
5239 	      free (input_debug.external_opt);
5240 	      free (input_debug.external_aux);
5241 	      free (input_debug.ss);
5242 	      free (input_debug.ssext);
5243 	      free (input_debug.external_fdr);
5244 	      free (input_debug.external_rfd);
5245 	      free (input_debug.external_ext);
5246 
5247 	      /* Hack: reset the SEC_HAS_CONTENTS flag so that
5248 		 elf_link_input_bfd ignores this section.  */
5249 	      input_section->flags &=~ SEC_HAS_CONTENTS;
5250 	    }
5251 
5252 	  /* Build the external symbol information.  */
5253 	  einfo.abfd = abfd;
5254 	  einfo.info = info;
5255 	  einfo.debug = &debug;
5256 	  einfo.swap = swap;
5257 	  einfo.failed = FALSE;
5258 	  elf_link_hash_traverse (elf_hash_table (info),
5259 				  elf64_alpha_output_extsym,
5260 				  &einfo);
5261 	  if (einfo.failed)
5262 	    return FALSE;
5263 
5264 	  /* Set the size of the .mdebug section.  */
5265 	  o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5266 
5267 	  /* Skip this section later on (I don't think this currently
5268 	     matters, but someday it might).  */
5269 	  o->map_head.link_order = (struct bfd_link_order *) NULL;
5270 
5271 	  mdebug_sec = o;
5272 	}
5273     }
5274 
5275   /* Invoke the regular ELF backend linker to do all the work.  */
5276   if (! bfd_elf_final_link (abfd, info))
5277     return FALSE;
5278 
5279   /* Now write out the computed sections.  */
5280 
5281   /* The .got subsections...  */
5282   {
5283     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5284     for (i = htab->got_list;
5285 	 i != NULL;
5286 	 i = alpha_elf_tdata(i)->got_link_next)
5287       {
5288 	asection *sgot;
5289 
5290 	/* elf_bfd_final_link already did everything in dynobj.  */
5291 	if (i == dynobj)
5292 	  continue;
5293 
5294 	sgot = alpha_elf_tdata(i)->got;
5295 	if (! bfd_set_section_contents (abfd, sgot->output_section,
5296 					sgot->contents,
5297 					(file_ptr) sgot->output_offset,
5298 					sgot->size))
5299 	  return FALSE;
5300       }
5301   }
5302 
5303   if (mdebug_sec != (asection *) NULL)
5304     {
5305       BFD_ASSERT (abfd->output_has_begun);
5306       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5307 					       swap, info,
5308 					       mdebug_sec->filepos))
5309 	return FALSE;
5310 
5311       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5312     }
5313 
5314   return TRUE;
5315 }
5316 
5317 static enum elf_reloc_type_class
5318 elf64_alpha_reloc_type_class (const Elf_Internal_Rela *rela)
5319 {
5320   switch ((int) ELF64_R_TYPE (rela->r_info))
5321     {
5322     case R_ALPHA_RELATIVE:
5323       return reloc_class_relative;
5324     case R_ALPHA_JMP_SLOT:
5325       return reloc_class_plt;
5326     case R_ALPHA_COPY:
5327       return reloc_class_copy;
5328     default:
5329       return reloc_class_normal;
5330     }
5331 }
5332 
5333 static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5334 {
5335   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5336   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5337   { NULL,                     0,  0, 0,            0 }
5338 };
5339 
5340 /* ECOFF swapping routines.  These are used when dealing with the
5341    .mdebug section, which is in the ECOFF debugging format.  Copied
5342    from elf32-mips.c.  */
5343 static const struct ecoff_debug_swap
5344 elf64_alpha_ecoff_debug_swap =
5345 {
5346   /* Symbol table magic number.  */
5347   magicSym2,
5348   /* Alignment of debugging information.  E.g., 4.  */
5349   8,
5350   /* Sizes of external symbolic information.  */
5351   sizeof (struct hdr_ext),
5352   sizeof (struct dnr_ext),
5353   sizeof (struct pdr_ext),
5354   sizeof (struct sym_ext),
5355   sizeof (struct opt_ext),
5356   sizeof (struct fdr_ext),
5357   sizeof (struct rfd_ext),
5358   sizeof (struct ext_ext),
5359   /* Functions to swap in external symbolic data.  */
5360   ecoff_swap_hdr_in,
5361   ecoff_swap_dnr_in,
5362   ecoff_swap_pdr_in,
5363   ecoff_swap_sym_in,
5364   ecoff_swap_opt_in,
5365   ecoff_swap_fdr_in,
5366   ecoff_swap_rfd_in,
5367   ecoff_swap_ext_in,
5368   _bfd_ecoff_swap_tir_in,
5369   _bfd_ecoff_swap_rndx_in,
5370   /* Functions to swap out external symbolic data.  */
5371   ecoff_swap_hdr_out,
5372   ecoff_swap_dnr_out,
5373   ecoff_swap_pdr_out,
5374   ecoff_swap_sym_out,
5375   ecoff_swap_opt_out,
5376   ecoff_swap_fdr_out,
5377   ecoff_swap_rfd_out,
5378   ecoff_swap_ext_out,
5379   _bfd_ecoff_swap_tir_out,
5380   _bfd_ecoff_swap_rndx_out,
5381   /* Function to read in symbolic data.  */
5382   elf64_alpha_read_ecoff_info
5383 };
5384 
5385 /* Use a non-standard hash bucket size of 8.  */
5386 
5387 static const struct elf_size_info alpha_elf_size_info =
5388 {
5389   sizeof (Elf64_External_Ehdr),
5390   sizeof (Elf64_External_Phdr),
5391   sizeof (Elf64_External_Shdr),
5392   sizeof (Elf64_External_Rel),
5393   sizeof (Elf64_External_Rela),
5394   sizeof (Elf64_External_Sym),
5395   sizeof (Elf64_External_Dyn),
5396   sizeof (Elf_External_Note),
5397   8,
5398   1,
5399   64, 3,
5400   ELFCLASS64, EV_CURRENT,
5401   bfd_elf64_write_out_phdrs,
5402   bfd_elf64_write_shdrs_and_ehdr,
5403   bfd_elf64_checksum_contents,
5404   bfd_elf64_write_relocs,
5405   bfd_elf64_swap_symbol_in,
5406   bfd_elf64_swap_symbol_out,
5407   bfd_elf64_slurp_reloc_table,
5408   bfd_elf64_slurp_symbol_table,
5409   bfd_elf64_swap_dyn_in,
5410   bfd_elf64_swap_dyn_out,
5411   bfd_elf64_swap_reloc_in,
5412   bfd_elf64_swap_reloc_out,
5413   bfd_elf64_swap_reloca_in,
5414   bfd_elf64_swap_reloca_out
5415 };
5416 
5417 #define TARGET_LITTLE_SYM	bfd_elf64_alpha_vec
5418 #define TARGET_LITTLE_NAME	"elf64-alpha"
5419 #define ELF_ARCH		bfd_arch_alpha
5420 #define ELF_TARGET_ID		ALPHA_ELF_DATA
5421 #define ELF_MACHINE_CODE	EM_ALPHA
5422 #define ELF_MAXPAGESIZE	0x10000
5423 #define ELF_COMMONPAGESIZE	0x2000
5424 
5425 #define bfd_elf64_bfd_link_hash_table_create \
5426   elf64_alpha_bfd_link_hash_table_create
5427 
5428 #define bfd_elf64_bfd_reloc_type_lookup \
5429   elf64_alpha_bfd_reloc_type_lookup
5430 #define bfd_elf64_bfd_reloc_name_lookup \
5431   elf64_alpha_bfd_reloc_name_lookup
5432 #define elf_info_to_howto \
5433   elf64_alpha_info_to_howto
5434 
5435 #define bfd_elf64_mkobject \
5436   elf64_alpha_mkobject
5437 #define elf_backend_object_p \
5438   elf64_alpha_object_p
5439 
5440 #define elf_backend_section_from_shdr \
5441   elf64_alpha_section_from_shdr
5442 #define elf_backend_section_flags \
5443   elf64_alpha_section_flags
5444 #define elf_backend_fake_sections \
5445   elf64_alpha_fake_sections
5446 
5447 #define bfd_elf64_bfd_is_local_label_name \
5448   elf64_alpha_is_local_label_name
5449 #define bfd_elf64_find_nearest_line \
5450   elf64_alpha_find_nearest_line
5451 #define bfd_elf64_bfd_relax_section \
5452   elf64_alpha_relax_section
5453 
5454 #define elf_backend_add_symbol_hook \
5455   elf64_alpha_add_symbol_hook
5456 #define elf_backend_relocs_compatible \
5457   _bfd_elf_relocs_compatible
5458 #define elf_backend_check_relocs \
5459   elf64_alpha_check_relocs
5460 #define elf_backend_create_dynamic_sections \
5461   elf64_alpha_create_dynamic_sections
5462 #define elf_backend_adjust_dynamic_symbol \
5463   elf64_alpha_adjust_dynamic_symbol
5464 #define elf_backend_merge_symbol_attribute \
5465   elf64_alpha_merge_symbol_attribute
5466 #define elf_backend_copy_indirect_symbol \
5467   elf64_alpha_copy_indirect_symbol
5468 #define elf_backend_always_size_sections \
5469   elf64_alpha_always_size_sections
5470 #define elf_backend_size_dynamic_sections \
5471   elf64_alpha_size_dynamic_sections
5472 #define elf_backend_omit_section_dynsym \
5473   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5474 #define elf_backend_relocate_section \
5475   elf64_alpha_relocate_section
5476 #define elf_backend_finish_dynamic_symbol \
5477   elf64_alpha_finish_dynamic_symbol
5478 #define elf_backend_finish_dynamic_sections \
5479   elf64_alpha_finish_dynamic_sections
5480 #define bfd_elf64_bfd_final_link \
5481   elf64_alpha_final_link
5482 #define elf_backend_reloc_type_class \
5483   elf64_alpha_reloc_type_class
5484 
5485 #define elf_backend_can_gc_sections	1
5486 #define elf_backend_gc_mark_hook	elf64_alpha_gc_mark_hook
5487 #define elf_backend_gc_sweep_hook	elf64_alpha_gc_sweep_hook
5488 
5489 #define elf_backend_ecoff_debug_swap \
5490   &elf64_alpha_ecoff_debug_swap
5491 
5492 #define elf_backend_size_info \
5493   alpha_elf_size_info
5494 
5495 #define elf_backend_special_sections \
5496   elf64_alpha_special_sections
5497 
5498 /* A few constants that determine how the .plt section is set up.  */
5499 #define elf_backend_want_got_plt 0
5500 #define elf_backend_plt_readonly 0
5501 #define elf_backend_want_plt_sym 1
5502 #define elf_backend_got_header_size 0
5503 
5504 #include "elf64-target.h"
5505 
5506 /* FreeBSD support.  */
5507 
5508 #undef TARGET_LITTLE_SYM
5509 #define TARGET_LITTLE_SYM	bfd_elf64_alpha_freebsd_vec
5510 #undef TARGET_LITTLE_NAME
5511 #define TARGET_LITTLE_NAME	"elf64-alpha-freebsd"
5512 #undef	ELF_OSABI
5513 #define	ELF_OSABI		ELFOSABI_FREEBSD
5514 
5515 /* The kernel recognizes executables as valid only if they carry a
5516    "FreeBSD" label in the ELF header.  So we put this label on all
5517    executables and (for simplicity) also all other object files.  */
5518 
5519 static void
5520 elf64_alpha_fbsd_post_process_headers (bfd * abfd,
5521 	struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
5522 {
5523   Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
5524 
5525   i_ehdrp = elf_elfheader (abfd);
5526 
5527   /* Put an ABI label supported by FreeBSD >= 4.1.  */
5528   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5529 #ifdef OLD_FREEBSD_ABI_LABEL
5530   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5531   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5532 #endif
5533 }
5534 
5535 #undef elf_backend_post_process_headers
5536 #define elf_backend_post_process_headers \
5537   elf64_alpha_fbsd_post_process_headers
5538 
5539 #undef  elf64_bed
5540 #define elf64_bed elf64_alpha_fbsd_bed
5541 
5542 #include "elf64-target.h"
5543