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