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