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