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