ELF: Don't set non_ir_ref_regular in check_relocs
[external/binutils.git] / bfd / elf64-alpha.c
1 /* Alpha specific support for 64-bit ELF
2    Copyright (C) 1996-2017 Free Software Foundation, Inc.
3    Contributed by Richard Henderson <rth@tamu.edu>.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22
23 /* We need a published ABI spec for this.  Until one comes out, don't
24    assume this'll remain unchanged forever.  */
25
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "libbfd.h"
29 #include "elf-bfd.h"
30
31 #include "elf/alpha.h"
32
33 #define ALPHAECOFF
34
35 #define NO_COFF_RELOCS
36 #define NO_COFF_SYMBOLS
37 #define NO_COFF_LINENOS
38
39 /* Get the ECOFF swapping routines.  Needed for the debug information.  */
40 #include "coff/internal.h"
41 #include "coff/sym.h"
42 #include "coff/symconst.h"
43 #include "coff/ecoff.h"
44 #include "coff/alpha.h"
45 #include "aout/ar.h"
46 #include "libcoff.h"
47 #include "libecoff.h"
48 #define ECOFF_64
49 #include "ecoffswap.h"
50
51 \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 ATTRIBUTE_UNUSED, arelent *cache_ptr,
1105                            Elf_Internal_Rela *dst)
1106 {
1107   unsigned r_type = ELF64_R_TYPE(dst->r_info);
1108
1109   if (r_type >= R_ALPHA_max)
1110     {
1111       /* xgettext:c-format */
1112       _bfd_error_handler (_("%B: unrecognised Alpha reloc number: %d"),
1113                           abfd, r_type);
1114       bfd_set_error (bfd_error_bad_value);
1115       r_type = R_ALPHA_NONE;
1116     }
1117   cache_ptr->howto = &elf64_alpha_howto_table[r_type];
1118 }
1119
1120 /* These two relocations create a two-word entry in the got.  */
1121 #define alpha_got_entry_size(r_type) \
1122   (r_type == R_ALPHA_TLSGD || r_type == R_ALPHA_TLSLDM ? 16 : 8)
1123
1124 /* This is PT_TLS segment p_vaddr.  */
1125 #define alpha_get_dtprel_base(info) \
1126   (elf_hash_table (info)->tls_sec->vma)
1127
1128 /* Main program TLS (whose template starts at PT_TLS p_vaddr)
1129    is assigned offset round(16, PT_TLS p_align).  */
1130 #define alpha_get_tprel_base(info) \
1131   (elf_hash_table (info)->tls_sec->vma                                  \
1132    - align_power ((bfd_vma) 16,                                         \
1133                   elf_hash_table (info)->tls_sec->alignment_power))
1134 \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                 (_("%B: .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         (_("%B: %A+%#Lx: warning: %s relocation against unexpected insn"),
3018          info->abfd, info->sec, irel->r_offset, howto->name);
3019       return TRUE;
3020     }
3021
3022   /* Can't relax dynamic symbols.  */
3023   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3024     return TRUE;
3025
3026   /* Can't use local-exec relocations in shared libraries.  */
3027   if (r_type == R_ALPHA_GOTTPREL
3028       && bfd_link_dll (info->link_info))
3029     return TRUE;
3030
3031   if (r_type == R_ALPHA_LITERAL)
3032     {
3033       /* Look for nice constant addresses.  This includes the not-uncommon
3034          special case of 0 for undefweak symbols.  */
3035       if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3036           || (!bfd_link_pic (info->link_info)
3037               && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3038         {
3039           disp = 0;
3040           insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3041           insn |= (symval & 0xffff);
3042           r_type = R_ALPHA_NONE;
3043         }
3044       else
3045         {
3046           /* We may only create GPREL relocs during the second pass.  */
3047           if (info->link_info->relax_pass == 0)
3048             return TRUE;
3049
3050           disp = symval - info->gp;
3051           insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3052           r_type = R_ALPHA_GPREL16;
3053         }
3054     }
3055   else
3056     {
3057       bfd_vma dtp_base, tp_base;
3058
3059       BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3060       dtp_base = alpha_get_dtprel_base (info->link_info);
3061       tp_base = alpha_get_tprel_base (info->link_info);
3062       disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3063
3064       insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3065
3066       switch (r_type)
3067         {
3068         case R_ALPHA_GOTDTPREL:
3069           r_type = R_ALPHA_DTPREL16;
3070           break;
3071         case R_ALPHA_GOTTPREL:
3072           r_type = R_ALPHA_TPREL16;
3073           break;
3074         default:
3075           BFD_ASSERT (0);
3076           return FALSE;
3077         }
3078     }
3079
3080   if (disp < -0x8000 || disp >= 0x8000)
3081     return TRUE;
3082
3083   bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3084   info->changed_contents = TRUE;
3085
3086   /* Reduce the use count on this got entry by one, possibly
3087      eliminating it.  */
3088   if (--info->gotent->use_count == 0)
3089     {
3090       int sz = alpha_got_entry_size (r_type);
3091       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3092       if (!info->h)
3093         alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3094     }
3095
3096   /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3097   irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3098   info->changed_relocs = TRUE;
3099
3100   /* ??? Search forward through this basic block looking for insns
3101      that use the target register.  Stop after an insn modifying the
3102      register is seen, or after a branch or call.
3103
3104      Any such memory load insn may be substituted by a load directly
3105      off the GP.  This allows the memory load insn to be issued before
3106      the calculated GP register would otherwise be ready.
3107
3108      Any such jsr insn can be replaced by a bsr if it is in range.
3109
3110      This would mean that we'd have to _add_ relocations, the pain of
3111      which gives one pause.  */
3112
3113   return TRUE;
3114 }
3115
3116 static bfd_vma
3117 elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3118 {
3119   /* If the function has the same gp, and we can identify that the
3120      function does not use its function pointer, we can eliminate the
3121      address load.  */
3122
3123   /* If the symbol is marked NOPV, we are being told the function never
3124      needs its procedure value.  */
3125   if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3126     return symval;
3127
3128   /* If the symbol is marked STD_GP, we are being told the function does
3129      a normal ldgp in the first two words.  */
3130   else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3131     ;
3132
3133   /* Otherwise, we may be able to identify a GP load in the first two
3134      words, which we can then skip.  */
3135   else
3136     {
3137       Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3138       bfd_vma ofs;
3139
3140       /* Load the relocations from the section that the target symbol is in.  */
3141       if (info->sec == info->tsec)
3142         {
3143           tsec_relocs = info->relocs;
3144           tsec_relend = info->relend;
3145           tsec_free = NULL;
3146         }
3147       else
3148         {
3149           tsec_relocs = (_bfd_elf_link_read_relocs
3150                          (info->abfd, info->tsec, NULL,
3151                          (Elf_Internal_Rela *) NULL,
3152                          info->link_info->keep_memory));
3153           if (tsec_relocs == NULL)
3154             return 0;
3155           tsec_relend = tsec_relocs + info->tsec->reloc_count;
3156           tsec_free = (elf_section_data (info->tsec)->relocs == tsec_relocs
3157                        ? NULL
3158                        : tsec_relocs);
3159         }
3160
3161       /* Recover the symbol's offset within the section.  */
3162       ofs = (symval - info->tsec->output_section->vma
3163              - info->tsec->output_offset);
3164
3165       /* Look for a GPDISP reloc.  */
3166       gpdisp = (elf64_alpha_find_reloc_at_ofs
3167                 (tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3168
3169       if (!gpdisp || gpdisp->r_addend != 4)
3170         {
3171           if (tsec_free)
3172             free (tsec_free);
3173           return 0;
3174         }
3175       if (tsec_free)
3176         free (tsec_free);
3177     }
3178
3179   /* We've now determined that we can skip an initial gp load.  Verify
3180      that the call and the target use the same gp.   */
3181   if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3182       || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3183     return 0;
3184
3185   return symval + 8;
3186 }
3187
3188 static bfd_boolean
3189 elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3190                                bfd_vma symval, Elf_Internal_Rela *irel)
3191 {
3192   Elf_Internal_Rela *urel, *erel, *irelend = info->relend;
3193   int flags;
3194   bfd_signed_vma disp;
3195   bfd_boolean fits16;
3196   bfd_boolean fits32;
3197   bfd_boolean lit_reused = FALSE;
3198   bfd_boolean all_optimized = TRUE;
3199   bfd_boolean changed_contents;
3200   bfd_boolean changed_relocs;
3201   bfd_byte *contents = info->contents;
3202   bfd *abfd = info->abfd;
3203   bfd_vma sec_output_vma;
3204   unsigned int lit_insn;
3205   int relax_pass;
3206
3207   lit_insn = bfd_get_32 (abfd, contents + irel->r_offset);
3208   if (lit_insn >> 26 != OP_LDQ)
3209     {
3210       _bfd_error_handler
3211         /* xgettext:c-format */
3212         (_("%B: %A+%#Lx: warning: LITERAL relocation against unexpected insn"),
3213          abfd, info->sec, irel->r_offset);
3214       return TRUE;
3215     }
3216
3217   /* Can't relax dynamic symbols.  */
3218   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3219     return TRUE;
3220
3221   changed_contents = info->changed_contents;
3222   changed_relocs = info->changed_relocs;
3223   sec_output_vma = info->sec->output_section->vma + info->sec->output_offset;
3224   relax_pass = info->link_info->relax_pass;
3225
3226   /* Summarize how this particular LITERAL is used.  */
3227   for (erel = irel+1, flags = 0; erel < irelend; ++erel)
3228     {
3229       if (ELF64_R_TYPE (erel->r_info) != R_ALPHA_LITUSE)
3230         break;
3231       if (erel->r_addend <= 6)
3232         flags |= 1 << erel->r_addend;
3233     }
3234
3235   /* A little preparation for the loop...  */
3236   disp = symval - info->gp;
3237
3238   for (urel = irel+1; urel < erel; ++urel)
3239     {
3240       bfd_vma urel_r_offset = urel->r_offset;
3241       unsigned int insn;
3242       int insn_disp;
3243       bfd_signed_vma xdisp;
3244       Elf_Internal_Rela nrel;
3245
3246       insn = bfd_get_32 (abfd, contents + urel_r_offset);
3247
3248       switch (urel->r_addend)
3249         {
3250         case LITUSE_ALPHA_ADDR:
3251         default:
3252           /* This type is really just a placeholder to note that all
3253              uses cannot be optimized, but to still allow some.  */
3254           all_optimized = FALSE;
3255           break;
3256
3257         case LITUSE_ALPHA_BASE:
3258           /* We may only create GPREL relocs during the second pass.  */
3259           if (relax_pass == 0)
3260             {
3261               all_optimized = FALSE;
3262               break;
3263             }
3264
3265           /* We can always optimize 16-bit displacements.  */
3266
3267           /* Extract the displacement from the instruction, sign-extending
3268              it if necessary, then test whether it is within 16 or 32 bits
3269              displacement from GP.  */
3270           insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3271
3272           xdisp = disp + insn_disp;
3273           fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3274           fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3275                     && xdisp < 0x7fff8000);
3276
3277           if (fits16)
3278             {
3279               /* Take the op code and dest from this insn, take the base
3280                  register from the literal insn.  Leave the offset alone.  */
3281               insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3282               bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3283               changed_contents = TRUE;
3284
3285               nrel = *urel;
3286               nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3287                                           R_ALPHA_GPREL16);
3288               nrel.r_addend = irel->r_addend;
3289
3290               /* As we adjust, move the reloc to the end so that we don't
3291                  break the LITERAL+LITUSE chain.  */
3292               if (urel < --erel)
3293                 *urel-- = *erel;
3294               *erel = nrel;
3295               changed_relocs = TRUE;
3296             }
3297
3298           /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3299           else if (fits32 && !(flags & ~6))
3300             {
3301               /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3302
3303               irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3304                                            R_ALPHA_GPRELHIGH);
3305               lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3306               bfd_put_32 (abfd, (bfd_vma) lit_insn, contents + irel->r_offset);
3307               lit_reused = TRUE;
3308               changed_contents = TRUE;
3309
3310               /* Since all relocs must be optimized, don't bother swapping
3311                  this relocation to the end.  */
3312               urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3313                                            R_ALPHA_GPRELLOW);
3314               urel->r_addend = irel->r_addend;
3315               changed_relocs = TRUE;
3316             }
3317           else
3318             all_optimized = FALSE;
3319           break;
3320
3321         case LITUSE_ALPHA_BYTOFF:
3322           /* We can always optimize byte instructions.  */
3323
3324           /* FIXME: sanity check the insn for byte op.  Check that the
3325              literal dest reg is indeed Rb in the byte insn.  */
3326
3327           insn &= ~ (unsigned) 0x001ff000;
3328           insn |= ((symval & 7) << 13) | 0x1000;
3329           bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3330           changed_contents = TRUE;
3331
3332           nrel = *urel;
3333           nrel.r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3334           nrel.r_addend = 0;
3335
3336           /* As we adjust, move the reloc to the end so that we don't
3337              break the LITERAL+LITUSE chain.  */
3338           if (urel < --erel)
3339             *urel-- = *erel;
3340           *erel = nrel;
3341           changed_relocs = TRUE;
3342           break;
3343
3344         case LITUSE_ALPHA_JSR:
3345         case LITUSE_ALPHA_TLSGD:
3346         case LITUSE_ALPHA_TLSLDM:
3347         case LITUSE_ALPHA_JSRDIRECT:
3348           {
3349             bfd_vma optdest, org;
3350             bfd_signed_vma odisp;
3351
3352             /* For undefined weak symbols, we're mostly interested in getting
3353                rid of the got entry whenever possible, so optimize this to a
3354                use of the zero register.  */
3355             if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3356               {
3357                 insn |= 31 << 16;
3358                 bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3359
3360                 changed_contents = TRUE;
3361                 break;
3362               }
3363
3364             /* If not zero, place to jump without needing pv.  */
3365             optdest = elf64_alpha_relax_opt_call (info, symval);
3366             org = sec_output_vma + urel_r_offset + 4;
3367             odisp = (optdest ? optdest : symval) - org;
3368
3369             if (odisp >= -0x400000 && odisp < 0x400000)
3370               {
3371                 Elf_Internal_Rela *xrel;
3372
3373                 /* Preserve branch prediction call stack when possible.  */
3374                 if ((insn & INSN_JSR_MASK) == INSN_JSR)
3375                   insn = (OP_BSR << 26) | (insn & 0x03e00000);
3376                 else
3377                   insn = (OP_BR << 26) | (insn & 0x03e00000);
3378                 bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3379                 changed_contents = TRUE;
3380
3381                 nrel = *urel;
3382                 nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3383                                             R_ALPHA_BRADDR);
3384                 nrel.r_addend = irel->r_addend;
3385
3386                 if (optdest)
3387                   nrel.r_addend += optdest - symval;
3388                 else
3389                   all_optimized = FALSE;
3390
3391                 /* Kill any HINT reloc that might exist for this insn.  */
3392                 xrel = (elf64_alpha_find_reloc_at_ofs
3393                         (info->relocs, info->relend, urel_r_offset,
3394                          R_ALPHA_HINT));
3395                 if (xrel)
3396                   xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3397
3398                 /* As we adjust, move the reloc to the end so that we don't
3399                    break the LITERAL+LITUSE chain.  */
3400                 if (urel < --erel)
3401                   *urel-- = *erel;
3402                 *erel = nrel;
3403
3404                 info->changed_relocs = TRUE;
3405               }
3406             else
3407               all_optimized = FALSE;
3408
3409             /* Even if the target is not in range for a direct branch,
3410                if we share a GP, we can eliminate the gp reload.  */
3411             if (optdest)
3412               {
3413                 Elf_Internal_Rela *gpdisp
3414                   = (elf64_alpha_find_reloc_at_ofs
3415                      (info->relocs, irelend, urel_r_offset + 4,
3416                       R_ALPHA_GPDISP));
3417                 if (gpdisp)
3418                   {
3419                     bfd_byte *p_ldah = contents + gpdisp->r_offset;
3420                     bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3421                     unsigned int ldah = bfd_get_32 (abfd, p_ldah);
3422                     unsigned int lda = bfd_get_32 (abfd, p_lda);
3423
3424                     /* Verify that the instruction is "ldah $29,0($26)".
3425                        Consider a function that ends in a noreturn call,
3426                        and that the next function begins with an ldgp,
3427                        and that by accident there is no padding between.
3428                        In that case the insn would use $27 as the base.  */
3429                     if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3430                       {
3431                         bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_ldah);
3432                         bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_lda);
3433
3434                         gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3435                         changed_contents = TRUE;
3436                         changed_relocs = TRUE;
3437                       }
3438                   }
3439               }
3440           }
3441           break;
3442         }
3443     }
3444
3445   /* If we reused the literal instruction, we must have optimized all.  */
3446   BFD_ASSERT(!lit_reused || all_optimized);
3447
3448   /* If all cases were optimized, we can reduce the use count on this
3449      got entry by one, possibly eliminating it.  */
3450   if (all_optimized)
3451     {
3452       if (--info->gotent->use_count == 0)
3453         {
3454           int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3455           alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3456           if (!info->h)
3457             alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3458         }
3459
3460       /* If the literal instruction is no longer needed (it may have been
3461          reused.  We can eliminate it.  */
3462       /* ??? For now, I don't want to deal with compacting the section,
3463          so just nop it out.  */
3464       if (!lit_reused)
3465         {
3466           irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3467           changed_relocs = TRUE;
3468
3469           bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, contents + irel->r_offset);
3470           changed_contents = TRUE;
3471         }
3472     }
3473
3474   info->changed_contents = changed_contents;
3475   info->changed_relocs = changed_relocs;
3476
3477   if (all_optimized || relax_pass == 0)
3478     return TRUE;
3479   return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3480 }
3481
3482 static bfd_boolean
3483 elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3484                                 Elf_Internal_Rela *irel, bfd_boolean is_gd)
3485 {
3486   bfd_byte *pos[5];
3487   unsigned int insn, tlsgd_reg;
3488   Elf_Internal_Rela *gpdisp, *hint;
3489   bfd_boolean dynamic, use_gottprel;
3490   unsigned long new_symndx;
3491
3492   dynamic = alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info);
3493
3494   /* If a TLS symbol is accessed using IE at least once, there is no point
3495      to use dynamic model for it.  */
3496   if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3497     ;
3498
3499   /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3500      then we might as well relax to IE.  */
3501   else if (bfd_link_pic (info->link_info) && !dynamic
3502            && (info->link_info->flags & DF_STATIC_TLS))
3503     ;
3504
3505   /* Otherwise we must be building an executable to do anything.  */
3506   else if (bfd_link_pic (info->link_info))
3507     return TRUE;
3508
3509   /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3510      the matching LITUSE_TLS relocations.  */
3511   if (irel + 2 >= info->relend)
3512     return TRUE;
3513   if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3514       || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3515       || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3516     return TRUE;
3517
3518   /* There must be a GPDISP relocation positioned immediately after the
3519      LITUSE relocation.  */
3520   gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3521                                           irel[2].r_offset + 4, R_ALPHA_GPDISP);
3522   if (!gpdisp)
3523     return TRUE;
3524
3525   pos[0] = info->contents + irel[0].r_offset;
3526   pos[1] = info->contents + irel[1].r_offset;
3527   pos[2] = info->contents + irel[2].r_offset;
3528   pos[3] = info->contents + gpdisp->r_offset;
3529   pos[4] = pos[3] + gpdisp->r_addend;
3530
3531   /* Beware of the compiler hoisting part of the sequence out a loop
3532      and adjusting the destination register for the TLSGD insn.  If this
3533      happens, there will be a move into $16 before the JSR insn, so only
3534      transformations of the first insn pair should use this register.  */
3535   tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3536   tlsgd_reg = (tlsgd_reg >> 21) & 31;
3537
3538   /* Generally, the positions are not allowed to be out of order, lest the
3539      modified insn sequence have different register lifetimes.  We can make
3540      an exception when pos 1 is adjacent to pos 0.  */
3541   if (pos[1] + 4 == pos[0])
3542     {
3543       bfd_byte *tmp = pos[0];
3544       pos[0] = pos[1];
3545       pos[1] = tmp;
3546     }
3547   if (pos[1] >= pos[2] || pos[2] >= pos[3])
3548     return TRUE;
3549
3550   /* Reduce the use count on the LITERAL relocation.  Do this before we
3551      smash the symndx when we adjust the relocations below.  */
3552   {
3553     struct alpha_elf_got_entry *lit_gotent;
3554     struct alpha_elf_link_hash_entry *lit_h;
3555     unsigned long indx;
3556
3557     BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3558     indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3559     lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3560
3561     while (lit_h->root.root.type == bfd_link_hash_indirect
3562            || lit_h->root.root.type == bfd_link_hash_warning)
3563       lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3564
3565     for (lit_gotent = lit_h->got_entries; lit_gotent ;
3566          lit_gotent = lit_gotent->next)
3567       if (lit_gotent->gotobj == info->gotobj
3568           && lit_gotent->reloc_type == R_ALPHA_LITERAL
3569           && lit_gotent->addend == irel[1].r_addend)
3570         break;
3571     BFD_ASSERT (lit_gotent);
3572
3573     if (--lit_gotent->use_count == 0)
3574       {
3575         int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3576         alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3577       }
3578   }
3579
3580   /* Change
3581
3582         lda     $16,x($gp)                      !tlsgd!1
3583         ldq     $27,__tls_get_addr($gp)         !literal!1
3584         jsr     $26,($27),__tls_get_addr        !lituse_tlsgd!1
3585         ldah    $29,0($26)                      !gpdisp!2
3586         lda     $29,0($29)                      !gpdisp!2
3587      to
3588         ldq     $16,x($gp)                      !gottprel
3589         unop
3590         call_pal rduniq
3591         addq    $16,$0,$0
3592         unop
3593      or the first pair to
3594         lda     $16,x($gp)                      !tprel
3595         unop
3596      or
3597         ldah    $16,x($gp)                      !tprelhi
3598         lda     $16,x($16)                      !tprello
3599
3600      as appropriate.  */
3601
3602   use_gottprel = FALSE;
3603   new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3604
3605   /* Some compilers warn about a Boolean-looking expression being
3606      used in a switch.  The explicit cast silences them.  */
3607   switch ((int) (!dynamic && !bfd_link_pic (info->link_info)))
3608     {
3609     case 1:
3610       {
3611         bfd_vma tp_base;
3612         bfd_signed_vma disp;
3613
3614         BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3615         tp_base = alpha_get_tprel_base (info->link_info);
3616         disp = symval - tp_base;
3617
3618         if (disp >= -0x8000 && disp < 0x8000)
3619           {
3620             insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3621             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3622             bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3623
3624             irel[0].r_offset = pos[0] - info->contents;
3625             irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3626             irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3627             break;
3628           }
3629         else if (disp >= -(bfd_signed_vma) 0x80000000
3630                  && disp < (bfd_signed_vma) 0x7fff8000
3631                  && pos[0] + 4 == pos[1])
3632           {
3633             insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3634             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3635             insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3636             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3637
3638             irel[0].r_offset = pos[0] - info->contents;
3639             irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3640             irel[1].r_offset = pos[1] - info->contents;
3641             irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3642             break;
3643           }
3644       }
3645       /* FALLTHRU */
3646
3647     default:
3648       use_gottprel = TRUE;
3649
3650       insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3651       bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3652       bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3653
3654       irel[0].r_offset = pos[0] - info->contents;
3655       irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3656       irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3657       break;
3658     }
3659
3660   bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3661
3662   insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3663   bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3664
3665   bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3666
3667   irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3668   gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3669
3670   hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3671                                         irel[2].r_offset, R_ALPHA_HINT);
3672   if (hint)
3673     hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3674
3675   info->changed_contents = TRUE;
3676   info->changed_relocs = TRUE;
3677
3678   /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3679   if (--info->gotent->use_count == 0)
3680     {
3681       int sz = alpha_got_entry_size (info->gotent->reloc_type);
3682       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3683       if (!info->h)
3684         alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3685     }
3686
3687   /* If we've switched to a GOTTPREL relocation, increment the reference
3688      count on that got entry.  */
3689   if (use_gottprel)
3690     {
3691       struct alpha_elf_got_entry *tprel_gotent;
3692
3693       for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3694            tprel_gotent = tprel_gotent->next)
3695         if (tprel_gotent->gotobj == info->gotobj
3696             && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3697             && tprel_gotent->addend == irel->r_addend)
3698           break;
3699       if (tprel_gotent)
3700         tprel_gotent->use_count++;
3701       else
3702         {
3703           if (info->gotent->use_count == 0)
3704             tprel_gotent = info->gotent;
3705           else
3706             {
3707               tprel_gotent = (struct alpha_elf_got_entry *)
3708                 bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3709               if (!tprel_gotent)
3710                 return FALSE;
3711
3712               tprel_gotent->next = *info->first_gotent;
3713               *info->first_gotent = tprel_gotent;
3714
3715               tprel_gotent->gotobj = info->gotobj;
3716               tprel_gotent->addend = irel->r_addend;
3717               tprel_gotent->got_offset = -1;
3718               tprel_gotent->reloc_done = 0;
3719               tprel_gotent->reloc_xlated = 0;
3720             }
3721
3722           tprel_gotent->use_count = 1;
3723           tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3724         }
3725     }
3726
3727   return TRUE;
3728 }
3729
3730 static bfd_boolean
3731 elf64_alpha_relax_section (bfd *abfd, asection *sec,
3732                            struct bfd_link_info *link_info, bfd_boolean *again)
3733 {
3734   Elf_Internal_Shdr *symtab_hdr;
3735   Elf_Internal_Rela *internal_relocs;
3736   Elf_Internal_Rela *irel, *irelend;
3737   Elf_Internal_Sym *isymbuf = NULL;
3738   struct alpha_elf_got_entry **local_got_entries;
3739   struct alpha_relax_info info;
3740   struct alpha_elf_link_hash_table * htab;
3741   int relax_pass;
3742
3743   htab = alpha_elf_hash_table (link_info);
3744   if (htab == NULL)
3745     return FALSE;
3746
3747   /* There's nothing to change, yet.  */
3748   *again = FALSE;
3749
3750   if (bfd_link_relocatable (link_info)
3751       || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3752           != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3753       || sec->reloc_count == 0)
3754     return TRUE;
3755
3756   BFD_ASSERT (is_alpha_elf (abfd));
3757   relax_pass = link_info->relax_pass;
3758
3759   /* Make sure our GOT and PLT tables are up-to-date.  */
3760   if (htab->relax_trip != link_info->relax_trip)
3761     {
3762       htab->relax_trip = link_info->relax_trip;
3763
3764       /* This should never fail after the initial round, since the only error
3765          is GOT overflow, and relaxation only shrinks the table.  However, we
3766          may only merge got sections during the first pass.  If we merge
3767          sections after we've created GPREL relocs, the GP for the merged
3768          section backs up which may put the relocs out of range.  */
3769       if (!elf64_alpha_size_got_sections (link_info, relax_pass == 0))
3770         abort ();
3771       if (elf_hash_table (link_info)->dynamic_sections_created)
3772         {
3773           elf64_alpha_size_plt_section (link_info);
3774           elf64_alpha_size_rela_got_section (link_info);
3775         }
3776     }
3777
3778   symtab_hdr = &elf_symtab_hdr (abfd);
3779   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3780
3781   /* Load the relocations for this section.  */
3782   internal_relocs = (_bfd_elf_link_read_relocs
3783                      (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3784                       link_info->keep_memory));
3785   if (internal_relocs == NULL)
3786     return FALSE;
3787
3788   memset(&info, 0, sizeof (info));
3789   info.abfd = abfd;
3790   info.sec = sec;
3791   info.link_info = link_info;
3792   info.symtab_hdr = symtab_hdr;
3793   info.relocs = internal_relocs;
3794   info.relend = irelend = internal_relocs + sec->reloc_count;
3795
3796   /* Find the GP for this object.  Do not store the result back via
3797      _bfd_set_gp_value, since this could change again before final.  */
3798   info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3799   if (info.gotobj)
3800     {
3801       asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3802       info.gp = (sgot->output_section->vma
3803                  + sgot->output_offset
3804                  + 0x8000);
3805     }
3806
3807   /* Get the section contents.  */
3808   if (elf_section_data (sec)->this_hdr.contents != NULL)
3809     info.contents = elf_section_data (sec)->this_hdr.contents;
3810   else
3811     {
3812       if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3813         goto error_return;
3814     }
3815
3816   for (irel = internal_relocs; irel < irelend; irel++)
3817     {
3818       bfd_vma symval;
3819       struct alpha_elf_got_entry *gotent;
3820       unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3821       unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3822
3823       /* Early exit for unhandled or unrelaxable relocations.  */
3824       if (r_type != R_ALPHA_LITERAL)
3825         {
3826           /* We complete everything except LITERAL in the first pass.  */
3827           if (relax_pass != 0)
3828             continue;
3829           if (r_type == R_ALPHA_TLSLDM)
3830             {
3831               /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3832                  reloc to the STN_UNDEF (0) symbol so that they all match.  */
3833               r_symndx = STN_UNDEF;
3834             }
3835           else if (r_type != R_ALPHA_GOTDTPREL
3836                    && r_type != R_ALPHA_GOTTPREL
3837                    && r_type != R_ALPHA_TLSGD)
3838             continue;
3839         }
3840
3841       /* Get the value of the symbol referred to by the reloc.  */
3842       if (r_symndx < symtab_hdr->sh_info)
3843         {
3844           /* A local symbol.  */
3845           Elf_Internal_Sym *isym;
3846
3847           /* Read this BFD's local symbols.  */
3848           if (isymbuf == NULL)
3849             {
3850               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3851               if (isymbuf == NULL)
3852                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3853                                                 symtab_hdr->sh_info, 0,
3854                                                 NULL, NULL, NULL);
3855               if (isymbuf == NULL)
3856                 goto error_return;
3857             }
3858
3859           isym = isymbuf + r_symndx;
3860
3861           /* Given the symbol for a TLSLDM reloc is ignored, this also
3862              means forcing the symbol value to the tp base.  */
3863           if (r_type == R_ALPHA_TLSLDM)
3864             {
3865               info.tsec = bfd_abs_section_ptr;
3866               symval = alpha_get_tprel_base (info.link_info);
3867             }
3868           else
3869             {
3870               symval = isym->st_value;
3871               if (isym->st_shndx == SHN_UNDEF)
3872                 continue;
3873               else if (isym->st_shndx == SHN_ABS)
3874                 info.tsec = bfd_abs_section_ptr;
3875               else if (isym->st_shndx == SHN_COMMON)
3876                 info.tsec = bfd_com_section_ptr;
3877               else
3878                 info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3879             }
3880
3881           info.h = NULL;
3882           info.other = isym->st_other;
3883           if (local_got_entries)
3884             info.first_gotent = &local_got_entries[r_symndx];
3885           else
3886             {
3887               info.first_gotent = &info.gotent;
3888               info.gotent = NULL;
3889             }
3890         }
3891       else
3892         {
3893           unsigned long indx;
3894           struct alpha_elf_link_hash_entry *h;
3895
3896           indx = r_symndx - symtab_hdr->sh_info;
3897           h = alpha_elf_sym_hashes (abfd)[indx];
3898           BFD_ASSERT (h != NULL);
3899
3900           while (h->root.root.type == bfd_link_hash_indirect
3901                  || h->root.root.type == bfd_link_hash_warning)
3902             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3903
3904           /* If the symbol is undefined, we can't do anything with it.  */
3905           if (h->root.root.type == bfd_link_hash_undefined)
3906             continue;
3907
3908           /* If the symbol isn't defined in the current module,
3909              again we can't do anything.  */
3910           if (h->root.root.type == bfd_link_hash_undefweak)
3911             {
3912               info.tsec = bfd_abs_section_ptr;
3913               symval = 0;
3914             }
3915           else if (!h->root.def_regular)
3916             {
3917               /* Except for TLSGD relocs, which can sometimes be
3918                  relaxed to GOTTPREL relocs.  */
3919               if (r_type != R_ALPHA_TLSGD)
3920                 continue;
3921               info.tsec = bfd_abs_section_ptr;
3922               symval = 0;
3923             }
3924           else
3925             {
3926               info.tsec = h->root.root.u.def.section;
3927               symval = h->root.root.u.def.value;
3928             }
3929
3930           info.h = h;
3931           info.other = h->root.other;
3932           info.first_gotent = &h->got_entries;
3933         }
3934
3935       /* Search for the got entry to be used by this relocation.  */
3936       for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3937         if (gotent->gotobj == info.gotobj
3938             && gotent->reloc_type == r_type
3939             && gotent->addend == irel->r_addend)
3940           break;
3941       info.gotent = gotent;
3942
3943       symval += info.tsec->output_section->vma + info.tsec->output_offset;
3944       symval += irel->r_addend;
3945
3946       switch (r_type)
3947         {
3948         case R_ALPHA_LITERAL:
3949           BFD_ASSERT(info.gotent != NULL);
3950
3951           /* If there exist LITUSE relocations immediately following, this
3952              opens up all sorts of interesting optimizations, because we
3953              now know every location that this address load is used.  */
3954           if (irel+1 < irelend
3955               && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3956             {
3957               if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3958                 goto error_return;
3959             }
3960           else
3961             {
3962               if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3963                 goto error_return;
3964             }
3965           break;
3966
3967         case R_ALPHA_GOTDTPREL:
3968         case R_ALPHA_GOTTPREL:
3969           BFD_ASSERT(info.gotent != NULL);
3970           if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3971             goto error_return;
3972           break;
3973
3974         case R_ALPHA_TLSGD:
3975         case R_ALPHA_TLSLDM:
3976           BFD_ASSERT(info.gotent != NULL);
3977           if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3978                                                r_type == R_ALPHA_TLSGD))
3979             goto error_return;
3980           break;
3981         }
3982     }
3983
3984   if (isymbuf != NULL
3985       && symtab_hdr->contents != (unsigned char *) isymbuf)
3986     {
3987       if (!link_info->keep_memory)
3988         free (isymbuf);
3989       else
3990         {
3991           /* Cache the symbols for elf_link_input_bfd.  */
3992           symtab_hdr->contents = (unsigned char *) isymbuf;
3993         }
3994     }
3995
3996   if (info.contents != NULL
3997       && elf_section_data (sec)->this_hdr.contents != info.contents)
3998     {
3999       if (!info.changed_contents && !link_info->keep_memory)
4000         free (info.contents);
4001       else
4002         {
4003           /* Cache the section contents for elf_link_input_bfd.  */
4004           elf_section_data (sec)->this_hdr.contents = info.contents;
4005         }
4006     }
4007
4008   if (elf_section_data (sec)->relocs != internal_relocs)
4009     {
4010       if (!info.changed_relocs)
4011         free (internal_relocs);
4012       else
4013         elf_section_data (sec)->relocs = internal_relocs;
4014     }
4015
4016   *again = info.changed_contents || info.changed_relocs;
4017
4018   return TRUE;
4019
4020  error_return:
4021   if (isymbuf != NULL
4022       && symtab_hdr->contents != (unsigned char *) isymbuf)
4023     free (isymbuf);
4024   if (info.contents != NULL
4025       && elf_section_data (sec)->this_hdr.contents != info.contents)
4026     free (info.contents);
4027   if (internal_relocs != NULL
4028       && elf_section_data (sec)->relocs != internal_relocs)
4029     free (internal_relocs);
4030   return FALSE;
4031 }
4032 \f
4033 /* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4034    into the next available slot in SREL.  */
4035
4036 static void
4037 elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4038                          asection *sec, asection *srel, bfd_vma offset,
4039                          long dynindx, long rtype, bfd_vma addend)
4040 {
4041   Elf_Internal_Rela outrel;
4042   bfd_byte *loc;
4043
4044   BFD_ASSERT (srel != NULL);
4045
4046   outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4047   outrel.r_addend = addend;
4048
4049   offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4050   if ((offset | 1) != (bfd_vma) -1)
4051     outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4052   else
4053     memset (&outrel, 0, sizeof (outrel));
4054
4055   loc = srel->contents;
4056   loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4057   bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4058   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4059 }
4060
4061 /* Relocate an Alpha ELF section for a relocatable link.
4062
4063    We don't have to change anything unless the reloc is against a section
4064    symbol, in which case we have to adjust according to where the section
4065    symbol winds up in the output section.  */
4066
4067 static bfd_boolean
4068 elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4069                                 struct bfd_link_info *info ATTRIBUTE_UNUSED,
4070                                 bfd *input_bfd, asection *input_section,
4071                                 bfd_byte *contents ATTRIBUTE_UNUSED,
4072                                 Elf_Internal_Rela *relocs,
4073                                 Elf_Internal_Sym *local_syms,
4074                                 asection **local_sections)
4075 {
4076   unsigned long symtab_hdr_sh_info;
4077   Elf_Internal_Rela *rel;
4078   Elf_Internal_Rela *relend;
4079   struct elf_link_hash_entry **sym_hashes;
4080   bfd_boolean ret_val = TRUE;
4081
4082   symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4083   sym_hashes = elf_sym_hashes (input_bfd);
4084
4085   relend = relocs + input_section->reloc_count;
4086   for (rel = relocs; rel < relend; rel++)
4087     {
4088       unsigned long r_symndx;
4089       Elf_Internal_Sym *sym;
4090       asection *sec;
4091       unsigned long r_type;
4092
4093       r_type = ELF64_R_TYPE (rel->r_info);
4094       if (r_type >= R_ALPHA_max)
4095         {
4096           _bfd_error_handler
4097             /* xgettext:c-format */
4098             (_("%B: unknown relocation type %d"),
4099              input_bfd, (int) r_type);
4100           bfd_set_error (bfd_error_bad_value);
4101           ret_val = FALSE;
4102           continue;
4103         }
4104
4105       /* The symbol associated with GPDISP and LITUSE is
4106          immaterial.  Only the addend is significant.  */
4107       if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4108         continue;
4109
4110       r_symndx = ELF64_R_SYM (rel->r_info);
4111       if (r_symndx < symtab_hdr_sh_info)
4112         {
4113           sym = local_syms + r_symndx;
4114           sec = local_sections[r_symndx];
4115         }
4116       else
4117         {
4118           struct elf_link_hash_entry *h;
4119
4120           h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4121
4122           while (h->root.type == bfd_link_hash_indirect
4123                  || h->root.type == bfd_link_hash_warning)
4124             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4125
4126           if (h->root.type != bfd_link_hash_defined
4127               && h->root.type != bfd_link_hash_defweak)
4128             continue;
4129
4130           sym = NULL;
4131           sec = h->root.u.def.section;
4132         }
4133
4134       if (sec != NULL && discarded_section (sec))
4135         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4136                                          rel, 1, relend,
4137                                          elf64_alpha_howto_table + r_type, 0,
4138                                          contents);
4139
4140       if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4141         rel->r_addend += sec->output_offset;
4142     }
4143
4144   return ret_val;
4145 }
4146
4147 /* Relocate an Alpha ELF section.  */
4148
4149 static bfd_boolean
4150 elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4151                               bfd *input_bfd, asection *input_section,
4152                               bfd_byte *contents, Elf_Internal_Rela *relocs,
4153                               Elf_Internal_Sym *local_syms,
4154                               asection **local_sections)
4155 {
4156   Elf_Internal_Shdr *symtab_hdr;
4157   Elf_Internal_Rela *rel;
4158   Elf_Internal_Rela *relend;
4159   asection *sgot, *srel, *srelgot;
4160   bfd *dynobj, *gotobj;
4161   bfd_vma gp, tp_base, dtp_base;
4162   struct alpha_elf_got_entry **local_got_entries;
4163   bfd_boolean ret_val;
4164
4165   BFD_ASSERT (is_alpha_elf (input_bfd));
4166
4167   /* Handle relocatable links with a smaller loop.  */
4168   if (bfd_link_relocatable (info))
4169     return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4170                                            input_section, contents, relocs,
4171                                            local_syms, local_sections);
4172
4173   /* This is a final link.  */
4174
4175   ret_val = TRUE;
4176
4177   symtab_hdr = &elf_symtab_hdr (input_bfd);
4178
4179   dynobj = elf_hash_table (info)->dynobj;
4180   srelgot = elf_hash_table (info)->srelgot;
4181
4182   if (input_section->flags & SEC_ALLOC)
4183     {
4184       const char *section_name;
4185       section_name = (bfd_elf_string_from_elf_section
4186                       (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4187                        _bfd_elf_single_rel_hdr (input_section)->sh_name));
4188       BFD_ASSERT(section_name != NULL);
4189       srel = bfd_get_linker_section (dynobj, section_name);
4190     }
4191   else
4192     srel = NULL;
4193
4194   /* Find the gp value for this input bfd.  */
4195   gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4196   if (gotobj)
4197     {
4198       sgot = alpha_elf_tdata (gotobj)->got;
4199       gp = _bfd_get_gp_value (gotobj);
4200       if (gp == 0)
4201         {
4202           gp = (sgot->output_section->vma
4203                 + sgot->output_offset
4204                 + 0x8000);
4205           _bfd_set_gp_value (gotobj, gp);
4206         }
4207     }
4208   else
4209     {
4210       sgot = NULL;
4211       gp = 0;
4212     }
4213
4214   local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4215
4216   if (elf_hash_table (info)->tls_sec != NULL)
4217     {
4218       dtp_base = alpha_get_dtprel_base (info);
4219       tp_base = alpha_get_tprel_base (info);
4220     }
4221   else
4222     dtp_base = tp_base = 0;
4223
4224   relend = relocs + input_section->reloc_count;
4225   for (rel = relocs; rel < relend; rel++)
4226     {
4227       struct alpha_elf_link_hash_entry *h = NULL;
4228       struct alpha_elf_got_entry *gotent;
4229       bfd_reloc_status_type r;
4230       reloc_howto_type *howto;
4231       unsigned long r_symndx;
4232       Elf_Internal_Sym *sym = NULL;
4233       asection *sec = NULL;
4234       bfd_vma value;
4235       bfd_vma addend;
4236       bfd_boolean dynamic_symbol_p;
4237       bfd_boolean unresolved_reloc = FALSE;
4238       bfd_boolean undef_weak_ref = FALSE;
4239       unsigned long r_type;
4240
4241       r_type = ELF64_R_TYPE(rel->r_info);
4242       if (r_type >= R_ALPHA_max)
4243         {
4244           _bfd_error_handler
4245             /* xgettext:c-format */
4246             (_("%B: unknown relocation type %d"),
4247              input_bfd, (int) r_type);
4248           bfd_set_error (bfd_error_bad_value);
4249           ret_val = FALSE;
4250           continue;
4251         }
4252
4253       howto = elf64_alpha_howto_table + r_type;
4254       r_symndx = ELF64_R_SYM(rel->r_info);
4255
4256       /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4257          reloc to the STN_UNDEF (0) symbol so that they all match.  */
4258       if (r_type == R_ALPHA_TLSLDM)
4259         r_symndx = STN_UNDEF;
4260
4261       if (r_symndx < symtab_hdr->sh_info)
4262         {
4263           asection *msec;
4264           sym = local_syms + r_symndx;
4265           sec = local_sections[r_symndx];
4266           msec = sec;
4267           value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4268
4269           /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4270              this is hackery from relax_section.  Force the value to
4271              be the tls module base.  */
4272           if (r_symndx == STN_UNDEF
4273               && (r_type == R_ALPHA_TLSLDM
4274                   || r_type == R_ALPHA_GOTTPREL
4275                   || r_type == R_ALPHA_TPREL64
4276                   || r_type == R_ALPHA_TPRELHI
4277                   || r_type == R_ALPHA_TPRELLO
4278                   || r_type == R_ALPHA_TPREL16))
4279             value = dtp_base;
4280
4281           if (local_got_entries)
4282             gotent = local_got_entries[r_symndx];
4283           else
4284             gotent = NULL;
4285
4286           /* Need to adjust local GOT entries' addends for SEC_MERGE
4287              unless it has been done already.  */
4288           if ((sec->flags & SEC_MERGE)
4289               && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4290               && sec->sec_info_type == SEC_INFO_TYPE_MERGE
4291               && gotent
4292               && !gotent->reloc_xlated)
4293             {
4294               struct alpha_elf_got_entry *ent;
4295
4296               for (ent = gotent; ent; ent = ent->next)
4297                 {
4298                   ent->reloc_xlated = 1;
4299                   if (ent->use_count == 0)
4300                     continue;
4301                   msec = sec;
4302                   ent->addend =
4303                     _bfd_merged_section_offset (output_bfd, &msec,
4304                                                 elf_section_data (sec)->
4305                                                   sec_info,
4306                                                 sym->st_value + ent->addend);
4307                   ent->addend -= sym->st_value;
4308                   ent->addend += msec->output_section->vma
4309                                  + msec->output_offset
4310                                  - sec->output_section->vma
4311                                  - sec->output_offset;
4312                 }
4313             }
4314
4315           dynamic_symbol_p = FALSE;
4316         }
4317       else
4318         {
4319           bfd_boolean warned, ignored;
4320           struct elf_link_hash_entry *hh;
4321           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4322
4323           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4324                                    r_symndx, symtab_hdr, sym_hashes,
4325                                    hh, sec, value,
4326                                    unresolved_reloc, warned, ignored);
4327
4328           if (warned)
4329             continue;
4330
4331           if (value == 0
4332               && ! unresolved_reloc
4333               && hh->root.type == bfd_link_hash_undefweak)
4334             undef_weak_ref = TRUE;
4335
4336           h = (struct alpha_elf_link_hash_entry *) hh;
4337           dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4338           gotent = h->got_entries;
4339         }
4340
4341       if (sec != NULL && discarded_section (sec))
4342         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4343                                          rel, 1, relend, howto, 0, contents);
4344
4345       addend = rel->r_addend;
4346       value += addend;
4347
4348       /* Search for the proper got entry.  */
4349       for (; gotent ; gotent = gotent->next)
4350         if (gotent->gotobj == gotobj
4351             && gotent->reloc_type == r_type
4352             && gotent->addend == addend)
4353           break;
4354
4355       switch (r_type)
4356         {
4357         case R_ALPHA_GPDISP:
4358           {
4359             bfd_byte *p_ldah, *p_lda;
4360
4361             BFD_ASSERT(gp != 0);
4362
4363             value = (input_section->output_section->vma
4364                      + input_section->output_offset
4365                      + rel->r_offset);
4366
4367             p_ldah = contents + rel->r_offset;
4368             p_lda = p_ldah + rel->r_addend;
4369
4370             r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4371                                              p_ldah, p_lda);
4372           }
4373           break;
4374
4375         case R_ALPHA_LITERAL:
4376           BFD_ASSERT(sgot != NULL);
4377           BFD_ASSERT(gp != 0);
4378           BFD_ASSERT(gotent != NULL);
4379           BFD_ASSERT(gotent->use_count >= 1);
4380
4381           if (!gotent->reloc_done)
4382             {
4383               gotent->reloc_done = 1;
4384
4385               bfd_put_64 (output_bfd, value,
4386                           sgot->contents + gotent->got_offset);
4387
4388               /* If the symbol has been forced local, output a
4389                  RELATIVE reloc, otherwise it will be handled in
4390                  finish_dynamic_symbol.  */
4391               if (bfd_link_pic (info)
4392                   && !dynamic_symbol_p
4393                   && !undef_weak_ref)
4394                 elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4395                                          gotent->got_offset, 0,
4396                                          R_ALPHA_RELATIVE, value);
4397             }
4398
4399           value = (sgot->output_section->vma
4400                    + sgot->output_offset
4401                    + gotent->got_offset);
4402           value -= gp;
4403           goto default_reloc;
4404
4405         case R_ALPHA_GPREL32:
4406         case R_ALPHA_GPREL16:
4407         case R_ALPHA_GPRELLOW:
4408           if (dynamic_symbol_p)
4409             {
4410               _bfd_error_handler
4411                 /* xgettext:c-format */
4412                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4413                  input_bfd, h->root.root.root.string);
4414               ret_val = FALSE;
4415             }
4416           BFD_ASSERT(gp != 0);
4417           value -= gp;
4418           goto default_reloc;
4419
4420         case R_ALPHA_GPRELHIGH:
4421           if (dynamic_symbol_p)
4422             {
4423               _bfd_error_handler
4424                 /* xgettext:c-format */
4425                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4426                  input_bfd, h->root.root.root.string);
4427               ret_val = FALSE;
4428             }
4429           BFD_ASSERT(gp != 0);
4430           value -= gp;
4431           value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4432           goto default_reloc;
4433
4434         case R_ALPHA_HINT:
4435           /* A call to a dynamic symbol is definitely out of range of
4436              the 16-bit displacement.  Don't bother writing anything.  */
4437           if (dynamic_symbol_p)
4438             {
4439               r = bfd_reloc_ok;
4440               break;
4441             }
4442           /* The regular PC-relative stuff measures from the start of
4443              the instruction rather than the end.  */
4444           value -= 4;
4445           goto default_reloc;
4446
4447         case R_ALPHA_BRADDR:
4448           if (dynamic_symbol_p)
4449             {
4450               _bfd_error_handler
4451                 /* xgettext:c-format */
4452                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4453                  input_bfd, h->root.root.root.string);
4454               ret_val = FALSE;
4455             }
4456           /* The regular PC-relative stuff measures from the start of
4457              the instruction rather than the end.  */
4458           value -= 4;
4459           goto default_reloc;
4460
4461         case R_ALPHA_BRSGP:
4462           {
4463             int other;
4464             const char *name;
4465
4466             /* The regular PC-relative stuff measures from the start of
4467                the instruction rather than the end.  */
4468             value -= 4;
4469
4470             /* The source and destination gp must be the same.  Note that
4471                the source will always have an assigned gp, since we forced
4472                one in check_relocs, but that the destination may not, as
4473                it might not have had any relocations at all.  Also take
4474                care not to crash if H is an undefined symbol.  */
4475             if (h != NULL && sec != NULL
4476                 && alpha_elf_tdata (sec->owner)->gotobj
4477                 && gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4478               {
4479                 _bfd_error_handler
4480                   /* xgettext:c-format */
4481                   (_("%B: change in gp: BRSGP %s"),
4482                    input_bfd, h->root.root.root.string);
4483                 ret_val = FALSE;
4484               }
4485
4486             /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4487             if (h != NULL)
4488               other = h->root.other;
4489             else
4490               other = sym->st_other;
4491             switch (other & STO_ALPHA_STD_GPLOAD)
4492               {
4493               case STO_ALPHA_NOPV:
4494                 break;
4495               case STO_ALPHA_STD_GPLOAD:
4496                 value += 8;
4497                 break;
4498               default:
4499                 if (h != NULL)
4500                   name = h->root.root.root.string;
4501                 else
4502                   {
4503                     name = (bfd_elf_string_from_elf_section
4504                             (input_bfd, symtab_hdr->sh_link, sym->st_name));
4505                     if (name == NULL)
4506                       name = _("<unknown>");
4507                     else if (name[0] == 0)
4508                       name = bfd_section_name (input_bfd, sec);
4509                   }
4510                 _bfd_error_handler
4511                   /* xgettext:c-format */
4512                   (_("%B: !samegp reloc against symbol without .prologue: %s"),
4513                    input_bfd, name);
4514                 ret_val = FALSE;
4515                 break;
4516               }
4517
4518             goto default_reloc;
4519           }
4520
4521         case R_ALPHA_REFLONG:
4522         case R_ALPHA_REFQUAD:
4523         case R_ALPHA_DTPREL64:
4524         case R_ALPHA_TPREL64:
4525           {
4526             long dynindx, dyntype = r_type;
4527             bfd_vma dynaddend;
4528
4529             /* Careful here to remember RELATIVE relocations for global
4530                variables for symbolic shared objects.  */
4531
4532             if (dynamic_symbol_p)
4533               {
4534                 BFD_ASSERT(h->root.dynindx != -1);
4535                 dynindx = h->root.dynindx;
4536                 dynaddend = addend;
4537                 addend = 0, value = 0;
4538               }
4539             else if (r_type == R_ALPHA_DTPREL64)
4540               {
4541                 BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4542                 value -= dtp_base;
4543                 goto default_reloc;
4544               }
4545             else if (r_type == R_ALPHA_TPREL64)
4546               {
4547                 BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4548                 if (!bfd_link_dll (info))
4549                   {
4550                     value -= tp_base;
4551                     goto default_reloc;
4552                   }
4553                 dynindx = 0;
4554                 dynaddend = value - dtp_base;
4555               }
4556             else if (bfd_link_pic (info)
4557                      && r_symndx != STN_UNDEF
4558                      && (input_section->flags & SEC_ALLOC)
4559                      && !undef_weak_ref
4560                      && !(unresolved_reloc
4561                           && (_bfd_elf_section_offset (output_bfd, info,
4562                                                        input_section,
4563                                                        rel->r_offset)
4564                               == (bfd_vma) -1)))
4565               {
4566                 if (r_type == R_ALPHA_REFLONG)
4567                   {
4568                     _bfd_error_handler
4569                       /* xgettext:c-format */
4570                       (_("%B: unhandled dynamic relocation against %s"),
4571                        input_bfd,
4572                        h->root.root.root.string);
4573                     ret_val = FALSE;
4574                   }
4575                 dynindx = 0;
4576                 dyntype = R_ALPHA_RELATIVE;
4577                 dynaddend = value;
4578               }
4579             else
4580               goto default_reloc;
4581
4582             if (input_section->flags & SEC_ALLOC)
4583               elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4584                                        srel, rel->r_offset, dynindx,
4585                                        dyntype, dynaddend);
4586           }
4587           goto default_reloc;
4588
4589         case R_ALPHA_SREL16:
4590         case R_ALPHA_SREL32:
4591         case R_ALPHA_SREL64:
4592           if (dynamic_symbol_p)
4593             {
4594               _bfd_error_handler
4595                 /* xgettext:c-format */
4596                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4597                  input_bfd, h->root.root.root.string);
4598               ret_val = FALSE;
4599             }
4600           else if (bfd_link_pic (info)
4601                    && undef_weak_ref)
4602             {
4603               _bfd_error_handler
4604                 /* xgettext:c-format */
4605                 (_("%B: pc-relative relocation against undefined weak symbol %s"),
4606                  input_bfd, h->root.root.root.string);
4607               ret_val = FALSE;
4608             }
4609
4610
4611           /* ??? .eh_frame references to discarded sections will be smashed
4612              to relocations against SHN_UNDEF.  The .eh_frame format allows
4613              NULL to be encoded as 0 in any format, so this works here.  */
4614           if (r_symndx == STN_UNDEF
4615               || (unresolved_reloc
4616                   && _bfd_elf_section_offset (output_bfd, info,
4617                                               input_section,
4618                                               rel->r_offset) == (bfd_vma) -1))
4619             howto = (elf64_alpha_howto_table
4620                      + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4621           goto default_reloc;
4622
4623         case R_ALPHA_TLSLDM:
4624           /* Ignore the symbol for the relocation.  The result is always
4625              the current module.  */
4626           dynamic_symbol_p = 0;
4627           /* FALLTHRU */
4628
4629         case R_ALPHA_TLSGD:
4630           if (!gotent->reloc_done)
4631             {
4632               gotent->reloc_done = 1;
4633
4634               /* Note that the module index for the main program is 1.  */
4635               bfd_put_64 (output_bfd,
4636                           !bfd_link_pic (info) && !dynamic_symbol_p,
4637                           sgot->contents + gotent->got_offset);
4638
4639               /* If the symbol has been forced local, output a
4640                  DTPMOD64 reloc, otherwise it will be handled in
4641                  finish_dynamic_symbol.  */
4642               if (bfd_link_pic (info) && !dynamic_symbol_p)
4643                 elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4644                                          gotent->got_offset, 0,
4645                                          R_ALPHA_DTPMOD64, 0);
4646
4647               if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4648                 value = 0;
4649               else
4650                 {
4651                   BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4652                   value -= dtp_base;
4653                 }
4654               bfd_put_64 (output_bfd, value,
4655                           sgot->contents + gotent->got_offset + 8);
4656             }
4657
4658           value = (sgot->output_section->vma
4659                    + sgot->output_offset
4660                    + gotent->got_offset);
4661           value -= gp;
4662           goto default_reloc;
4663
4664         case R_ALPHA_DTPRELHI:
4665         case R_ALPHA_DTPRELLO:
4666         case R_ALPHA_DTPREL16:
4667           if (dynamic_symbol_p)
4668             {
4669               _bfd_error_handler
4670                 /* xgettext:c-format */
4671                 (_("%B: dtp-relative relocation against dynamic symbol %s"),
4672                  input_bfd, h->root.root.root.string);
4673               ret_val = FALSE;
4674             }
4675           BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4676           value -= dtp_base;
4677           if (r_type == R_ALPHA_DTPRELHI)
4678             value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4679           goto default_reloc;
4680
4681         case R_ALPHA_TPRELHI:
4682         case R_ALPHA_TPRELLO:
4683         case R_ALPHA_TPREL16:
4684           if (bfd_link_dll (info))
4685             {
4686               _bfd_error_handler
4687                 /* xgettext:c-format */
4688                 (_("%B: TLS local exec code cannot be linked into shared objects"),
4689                 input_bfd);
4690               ret_val = FALSE;
4691             }
4692           else if (dynamic_symbol_p)
4693             {
4694               _bfd_error_handler
4695                 /* xgettext:c-format */
4696                 (_("%B: tp-relative relocation against dynamic symbol %s"),
4697                  input_bfd, h->root.root.root.string);
4698               ret_val = FALSE;
4699             }
4700           BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4701           value -= tp_base;
4702           if (r_type == R_ALPHA_TPRELHI)
4703             value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4704           goto default_reloc;
4705
4706         case R_ALPHA_GOTDTPREL:
4707         case R_ALPHA_GOTTPREL:
4708           BFD_ASSERT(sgot != NULL);
4709           BFD_ASSERT(gp != 0);
4710           BFD_ASSERT(gotent != NULL);
4711           BFD_ASSERT(gotent->use_count >= 1);
4712
4713           if (!gotent->reloc_done)
4714             {
4715               gotent->reloc_done = 1;
4716
4717               if (dynamic_symbol_p)
4718                 value = 0;
4719               else
4720                 {
4721                   BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4722                   if (r_type == R_ALPHA_GOTDTPREL)
4723                     value -= dtp_base;
4724                   else if (!bfd_link_pic (info))
4725                     value -= tp_base;
4726                   else
4727                     {
4728                       elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4729                                                gotent->got_offset, 0,
4730                                                R_ALPHA_TPREL64,
4731                                                value - dtp_base);
4732                       value = 0;
4733                     }
4734                 }
4735               bfd_put_64 (output_bfd, value,
4736                           sgot->contents + gotent->got_offset);
4737             }
4738
4739           value = (sgot->output_section->vma
4740                    + sgot->output_offset
4741                    + gotent->got_offset);
4742           value -= gp;
4743           goto default_reloc;
4744
4745         default:
4746         default_reloc:
4747           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4748                                         contents, rel->r_offset, value, 0);
4749           break;
4750         }
4751
4752       switch (r)
4753         {
4754         case bfd_reloc_ok:
4755           break;
4756
4757         case bfd_reloc_overflow:
4758           {
4759             const char *name;
4760
4761             /* Don't warn if the overflow is due to pc relative reloc
4762                against discarded section.  Section optimization code should
4763                handle it.  */
4764
4765             if (r_symndx < symtab_hdr->sh_info
4766                 && sec != NULL && howto->pc_relative
4767                 && discarded_section (sec))
4768               break;
4769
4770             if (h != NULL)
4771               name = NULL;
4772             else
4773               {
4774                 name = (bfd_elf_string_from_elf_section
4775                         (input_bfd, symtab_hdr->sh_link, sym->st_name));
4776                 if (name == NULL)
4777                   return FALSE;
4778                 if (*name == '\0')
4779                   name = bfd_section_name (input_bfd, sec);
4780               }
4781             (*info->callbacks->reloc_overflow)
4782               (info, (h ? &h->root.root : NULL), name, howto->name,
4783                (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4784           }
4785           break;
4786
4787         default:
4788         case bfd_reloc_outofrange:
4789           abort ();
4790         }
4791     }
4792
4793   return ret_val;
4794 }
4795
4796 /* Finish up dynamic symbol handling.  We set the contents of various
4797    dynamic sections here.  */
4798
4799 static bfd_boolean
4800 elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4801                                    struct elf_link_hash_entry *h,
4802                                    Elf_Internal_Sym *sym)
4803 {
4804   struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4805
4806   if (h->needs_plt)
4807     {
4808       /* Fill in the .plt entry for this symbol.  */
4809       asection *splt, *sgot, *srel;
4810       Elf_Internal_Rela outrel;
4811       bfd_byte *loc;
4812       bfd_vma got_addr, plt_addr;
4813       bfd_vma plt_index;
4814       struct alpha_elf_got_entry *gotent;
4815
4816       BFD_ASSERT (h->dynindx != -1);
4817
4818       splt = elf_hash_table (info)->splt;
4819       BFD_ASSERT (splt != NULL);
4820       srel = elf_hash_table (info)->srelplt;
4821       BFD_ASSERT (srel != NULL);
4822
4823       for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4824         if (gotent->reloc_type == R_ALPHA_LITERAL
4825             && gotent->use_count > 0)
4826           {
4827             unsigned int insn;
4828             int disp;
4829
4830             sgot = alpha_elf_tdata (gotent->gotobj)->got;
4831             BFD_ASSERT (sgot != NULL);
4832
4833             BFD_ASSERT (gotent->got_offset != -1);
4834             BFD_ASSERT (gotent->plt_offset != -1);
4835
4836             got_addr = (sgot->output_section->vma
4837                         + sgot->output_offset
4838                         + gotent->got_offset);
4839             plt_addr = (splt->output_section->vma
4840                         + splt->output_offset
4841                         + gotent->plt_offset);
4842
4843             plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4844
4845             /* Fill in the entry in the procedure linkage table.  */
4846             if (elf64_alpha_use_secureplt)
4847               {
4848                 disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4849                 insn = INSN_AD (INSN_BR, 31, disp);
4850                 bfd_put_32 (output_bfd, insn,
4851                             splt->contents + gotent->plt_offset);
4852
4853                 plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4854                              / NEW_PLT_ENTRY_SIZE);
4855               }
4856             else
4857               {
4858                 disp = -(gotent->plt_offset + 4);
4859                 insn = INSN_AD (INSN_BR, 28, disp);
4860                 bfd_put_32 (output_bfd, insn,
4861                             splt->contents + gotent->plt_offset);
4862                 bfd_put_32 (output_bfd, INSN_UNOP,
4863                             splt->contents + gotent->plt_offset + 4);
4864                 bfd_put_32 (output_bfd, INSN_UNOP,
4865                             splt->contents + gotent->plt_offset + 8);
4866
4867                 plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4868                              / OLD_PLT_ENTRY_SIZE);
4869               }
4870
4871             /* Fill in the entry in the .rela.plt section.  */
4872             outrel.r_offset = got_addr;
4873             outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4874             outrel.r_addend = 0;
4875
4876             loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4877             bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4878
4879             /* Fill in the entry in the .got.  */
4880             bfd_put_64 (output_bfd, plt_addr,
4881                         sgot->contents + gotent->got_offset);
4882           }
4883     }
4884   else if (alpha_elf_dynamic_symbol_p (h, info))
4885     {
4886       /* Fill in the dynamic relocations for this symbol's .got entries.  */
4887       asection *srel;
4888       struct alpha_elf_got_entry *gotent;
4889
4890       srel = elf_hash_table (info)->srelgot;
4891       BFD_ASSERT (srel != NULL);
4892
4893       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4894            gotent != NULL;
4895            gotent = gotent->next)
4896         {
4897           asection *sgot;
4898           long r_type;
4899
4900           if (gotent->use_count == 0)
4901             continue;
4902
4903           sgot = alpha_elf_tdata (gotent->gotobj)->got;
4904
4905           r_type = gotent->reloc_type;
4906           switch (r_type)
4907             {
4908             case R_ALPHA_LITERAL:
4909               r_type = R_ALPHA_GLOB_DAT;
4910               break;
4911             case R_ALPHA_TLSGD:
4912               r_type = R_ALPHA_DTPMOD64;
4913               break;
4914             case R_ALPHA_GOTDTPREL:
4915               r_type = R_ALPHA_DTPREL64;
4916               break;
4917             case R_ALPHA_GOTTPREL:
4918               r_type = R_ALPHA_TPREL64;
4919               break;
4920             case R_ALPHA_TLSLDM:
4921             default:
4922               abort ();
4923             }
4924
4925           elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4926                                    gotent->got_offset, h->dynindx,
4927                                    r_type, gotent->addend);
4928
4929           if (gotent->reloc_type == R_ALPHA_TLSGD)
4930             elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4931                                      gotent->got_offset + 8, h->dynindx,
4932                                      R_ALPHA_DTPREL64, gotent->addend);
4933         }
4934     }
4935
4936   /* Mark some specially defined symbols as absolute.  */
4937   if (h == elf_hash_table (info)->hdynamic
4938       || h == elf_hash_table (info)->hgot
4939       || h == elf_hash_table (info)->hplt)
4940     sym->st_shndx = SHN_ABS;
4941
4942   return TRUE;
4943 }
4944
4945 /* Finish up the dynamic sections.  */
4946
4947 static bfd_boolean
4948 elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4949                                      struct bfd_link_info *info)
4950 {
4951   bfd *dynobj;
4952   asection *sdyn;
4953
4954   dynobj = elf_hash_table (info)->dynobj;
4955   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4956
4957   if (elf_hash_table (info)->dynamic_sections_created)
4958     {
4959       asection *splt, *sgotplt, *srelaplt;
4960       Elf64_External_Dyn *dyncon, *dynconend;
4961       bfd_vma plt_vma, gotplt_vma;
4962
4963       splt = elf_hash_table (info)->splt;
4964       srelaplt = elf_hash_table (info)->srelplt;
4965       BFD_ASSERT (splt != NULL && sdyn != NULL);
4966
4967       plt_vma = splt->output_section->vma + splt->output_offset;
4968
4969       gotplt_vma = 0;
4970       if (elf64_alpha_use_secureplt)
4971         {
4972           sgotplt = elf_hash_table (info)->sgotplt;
4973           BFD_ASSERT (sgotplt != NULL);
4974           if (sgotplt->size > 0)
4975             gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4976         }
4977
4978       dyncon = (Elf64_External_Dyn *) sdyn->contents;
4979       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4980       for (; dyncon < dynconend; dyncon++)
4981         {
4982           Elf_Internal_Dyn dyn;
4983
4984           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4985
4986           switch (dyn.d_tag)
4987             {
4988             case DT_PLTGOT:
4989               dyn.d_un.d_ptr
4990                 = elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4991               break;
4992             case DT_PLTRELSZ:
4993               dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
4994               break;
4995             case DT_JMPREL:
4996               dyn.d_un.d_ptr = srelaplt ? (srelaplt->output_section->vma
4997                                            + srelaplt->output_offset) : 0;
4998               break;
4999             }
5000
5001           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5002         }
5003
5004       /* Initialize the plt header.  */
5005       if (splt->size > 0)
5006         {
5007           unsigned int insn;
5008           int ofs;
5009
5010           if (elf64_alpha_use_secureplt)
5011             {
5012               ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
5013
5014               insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
5015               bfd_put_32 (output_bfd, insn, splt->contents);
5016
5017               insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
5018               bfd_put_32 (output_bfd, insn, splt->contents + 4);
5019
5020               insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
5021               bfd_put_32 (output_bfd, insn, splt->contents + 8);
5022
5023               insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
5024               bfd_put_32 (output_bfd, insn, splt->contents + 12);
5025
5026               insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
5027               bfd_put_32 (output_bfd, insn, splt->contents + 16);
5028
5029               insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
5030               bfd_put_32 (output_bfd, insn, splt->contents + 20);
5031
5032               insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
5033               bfd_put_32 (output_bfd, insn, splt->contents + 24);
5034
5035               insn = INSN_AB (INSN_JMP, 31, 27);
5036               bfd_put_32 (output_bfd, insn, splt->contents + 28);
5037
5038               insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
5039               bfd_put_32 (output_bfd, insn, splt->contents + 32);
5040             }
5041           else
5042             {
5043               insn = INSN_AD (INSN_BR, 27, 0);  /* br $27, .+4 */
5044               bfd_put_32 (output_bfd, insn, splt->contents);
5045
5046               insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5047               bfd_put_32 (output_bfd, insn, splt->contents + 4);
5048
5049               insn = INSN_UNOP;
5050               bfd_put_32 (output_bfd, insn, splt->contents + 8);
5051
5052               insn = INSN_AB (INSN_JMP, 27, 27);
5053               bfd_put_32 (output_bfd, insn, splt->contents + 12);
5054
5055               /* The next two words will be filled in by ld.so.  */
5056               bfd_put_64 (output_bfd, 0, splt->contents + 16);
5057               bfd_put_64 (output_bfd, 0, splt->contents + 24);
5058             }
5059
5060           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5061         }
5062     }
5063
5064   return TRUE;
5065 }
5066
5067 /* We need to use a special link routine to handle the .mdebug section.
5068    We need to merge all instances of these sections together, not write
5069    them all out sequentially.  */
5070
5071 static bfd_boolean
5072 elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5073 {
5074   asection *o;
5075   struct bfd_link_order *p;
5076   asection *mdebug_sec;
5077   struct ecoff_debug_info debug;
5078   const struct ecoff_debug_swap *swap
5079     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5080   HDRR *symhdr = &debug.symbolic_header;
5081   void * mdebug_handle = NULL;
5082   struct alpha_elf_link_hash_table * htab;
5083
5084   htab = alpha_elf_hash_table (info);
5085   if (htab == NULL)
5086     return FALSE;
5087
5088   /* Go through the sections and collect the mdebug information.  */
5089   mdebug_sec = NULL;
5090   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5091     {
5092       if (strcmp (o->name, ".mdebug") == 0)
5093         {
5094           struct extsym_info einfo;
5095
5096           /* We have found the .mdebug section in the output file.
5097              Look through all the link_orders comprising it and merge
5098              the information together.  */
5099           symhdr->magic = swap->sym_magic;
5100           /* FIXME: What should the version stamp be?  */
5101           symhdr->vstamp = 0;
5102           symhdr->ilineMax = 0;
5103           symhdr->cbLine = 0;
5104           symhdr->idnMax = 0;
5105           symhdr->ipdMax = 0;
5106           symhdr->isymMax = 0;
5107           symhdr->ioptMax = 0;
5108           symhdr->iauxMax = 0;
5109           symhdr->issMax = 0;
5110           symhdr->issExtMax = 0;
5111           symhdr->ifdMax = 0;
5112           symhdr->crfd = 0;
5113           symhdr->iextMax = 0;
5114
5115           /* We accumulate the debugging information itself in the
5116              debug_info structure.  */
5117           debug.line = NULL;
5118           debug.external_dnr = NULL;
5119           debug.external_pdr = NULL;
5120           debug.external_sym = NULL;
5121           debug.external_opt = NULL;
5122           debug.external_aux = NULL;
5123           debug.ss = NULL;
5124           debug.ssext = debug.ssext_end = NULL;
5125           debug.external_fdr = NULL;
5126           debug.external_rfd = NULL;
5127           debug.external_ext = debug.external_ext_end = NULL;
5128
5129           mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5130           if (mdebug_handle == NULL)
5131             return FALSE;
5132
5133           if (1)
5134             {
5135               asection *s;
5136               EXTR esym;
5137               bfd_vma last = 0;
5138               unsigned int i;
5139               static const char * const name[] =
5140                 {
5141                   ".text", ".init", ".fini", ".data",
5142                   ".rodata", ".sdata", ".sbss", ".bss"
5143                 };
5144               static const int sc[] = { scText, scInit, scFini, scData,
5145                                           scRData, scSData, scSBss, scBss };
5146
5147               esym.jmptbl = 0;
5148               esym.cobol_main = 0;
5149               esym.weakext = 0;
5150               esym.reserved = 0;
5151               esym.ifd = ifdNil;
5152               esym.asym.iss = issNil;
5153               esym.asym.st = stLocal;
5154               esym.asym.reserved = 0;
5155               esym.asym.index = indexNil;
5156               for (i = 0; i < 8; i++)
5157                 {
5158                   esym.asym.sc = sc[i];
5159                   s = bfd_get_section_by_name (abfd, name[i]);
5160                   if (s != NULL)
5161                     {
5162                       esym.asym.value = s->vma;
5163                       last = s->vma + s->size;
5164                     }
5165                   else
5166                     esym.asym.value = last;
5167
5168                   if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5169                                                       name[i], &esym))
5170                     return FALSE;
5171                 }
5172             }
5173
5174           for (p = o->map_head.link_order;
5175                p != (struct bfd_link_order *) NULL;
5176                p = p->next)
5177             {
5178               asection *input_section;
5179               bfd *input_bfd;
5180               const struct ecoff_debug_swap *input_swap;
5181               struct ecoff_debug_info input_debug;
5182               char *eraw_src;
5183               char *eraw_end;
5184
5185               if (p->type != bfd_indirect_link_order)
5186                 {
5187                   if (p->type == bfd_data_link_order)
5188                     continue;
5189                   abort ();
5190                 }
5191
5192               input_section = p->u.indirect.section;
5193               input_bfd = input_section->owner;
5194
5195               if (! is_alpha_elf (input_bfd))
5196                 /* I don't know what a non ALPHA ELF bfd would be
5197                    doing with a .mdebug section, but I don't really
5198                    want to deal with it.  */
5199                 continue;
5200
5201               input_swap = (get_elf_backend_data (input_bfd)
5202                             ->elf_backend_ecoff_debug_swap);
5203
5204               BFD_ASSERT (p->size == input_section->size);
5205
5206               /* The ECOFF linking code expects that we have already
5207                  read in the debugging information and set up an
5208                  ecoff_debug_info structure, so we do that now.  */
5209               if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5210                                                 &input_debug))
5211                 return FALSE;
5212
5213               if (! (bfd_ecoff_debug_accumulate
5214                      (mdebug_handle, abfd, &debug, swap, input_bfd,
5215                       &input_debug, input_swap, info)))
5216                 return FALSE;
5217
5218               /* Loop through the external symbols.  For each one with
5219                  interesting information, try to find the symbol in
5220                  the linker global hash table and save the information
5221                  for the output external symbols.  */
5222               eraw_src = (char *) input_debug.external_ext;
5223               eraw_end = (eraw_src
5224                           + (input_debug.symbolic_header.iextMax
5225                              * input_swap->external_ext_size));
5226               for (;
5227                    eraw_src < eraw_end;
5228                    eraw_src += input_swap->external_ext_size)
5229                 {
5230                   EXTR ext;
5231                   const char *name;
5232                   struct alpha_elf_link_hash_entry *h;
5233
5234                   (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
5235                   if (ext.asym.sc == scNil
5236                       || ext.asym.sc == scUndefined
5237                       || ext.asym.sc == scSUndefined)
5238                     continue;
5239
5240                   name = input_debug.ssext + ext.asym.iss;
5241                   h = alpha_elf_link_hash_lookup (htab, name, FALSE, FALSE, TRUE);
5242                   if (h == NULL || h->esym.ifd != -2)
5243                     continue;
5244
5245                   if (ext.ifd != -1)
5246                     {
5247                       BFD_ASSERT (ext.ifd
5248                                   < input_debug.symbolic_header.ifdMax);
5249                       ext.ifd = input_debug.ifdmap[ext.ifd];
5250                     }
5251
5252                   h->esym = ext;
5253                 }
5254
5255               /* Free up the information we just read.  */
5256               free (input_debug.line);
5257               free (input_debug.external_dnr);
5258               free (input_debug.external_pdr);
5259               free (input_debug.external_sym);
5260               free (input_debug.external_opt);
5261               free (input_debug.external_aux);
5262               free (input_debug.ss);
5263               free (input_debug.ssext);
5264               free (input_debug.external_fdr);
5265               free (input_debug.external_rfd);
5266               free (input_debug.external_ext);
5267
5268               /* Hack: reset the SEC_HAS_CONTENTS flag so that
5269                  elf_link_input_bfd ignores this section.  */
5270               input_section->flags &=~ SEC_HAS_CONTENTS;
5271             }
5272
5273           /* Build the external symbol information.  */
5274           einfo.abfd = abfd;
5275           einfo.info = info;
5276           einfo.debug = &debug;
5277           einfo.swap = swap;
5278           einfo.failed = FALSE;
5279           elf_link_hash_traverse (elf_hash_table (info),
5280                                   elf64_alpha_output_extsym,
5281                                   &einfo);
5282           if (einfo.failed)
5283             return FALSE;
5284
5285           /* Set the size of the .mdebug section.  */
5286           o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5287
5288           /* Skip this section later on (I don't think this currently
5289              matters, but someday it might).  */
5290           o->map_head.link_order = (struct bfd_link_order *) NULL;
5291
5292           mdebug_sec = o;
5293         }
5294     }
5295
5296   /* Invoke the regular ELF backend linker to do all the work.  */
5297   if (! bfd_elf_final_link (abfd, info))
5298     return FALSE;
5299
5300   /* Now write out the computed sections.  */
5301
5302   /* The .got subsections...  */
5303   {
5304     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5305     for (i = htab->got_list;
5306          i != NULL;
5307          i = alpha_elf_tdata(i)->got_link_next)
5308       {
5309         asection *sgot;
5310
5311         /* elf_bfd_final_link already did everything in dynobj.  */
5312         if (i == dynobj)
5313           continue;
5314
5315         sgot = alpha_elf_tdata(i)->got;
5316         if (! bfd_set_section_contents (abfd, sgot->output_section,
5317                                         sgot->contents,
5318                                         (file_ptr) sgot->output_offset,
5319                                         sgot->size))
5320           return FALSE;
5321       }
5322   }
5323
5324   if (mdebug_sec != (asection *) NULL)
5325     {
5326       BFD_ASSERT (abfd->output_has_begun);
5327       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5328                                                swap, info,
5329                                                mdebug_sec->filepos))
5330         return FALSE;
5331
5332       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5333     }
5334
5335   return TRUE;
5336 }
5337
5338 static enum elf_reloc_type_class
5339 elf64_alpha_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5340                               const asection *rel_sec ATTRIBUTE_UNUSED,
5341                               const Elf_Internal_Rela *rela)
5342 {
5343   switch ((int) ELF64_R_TYPE (rela->r_info))
5344     {
5345     case R_ALPHA_RELATIVE:
5346       return reloc_class_relative;
5347     case R_ALPHA_JMP_SLOT:
5348       return reloc_class_plt;
5349     case R_ALPHA_COPY:
5350       return reloc_class_copy;
5351     default:
5352       return reloc_class_normal;
5353     }
5354 }
5355 \f
5356 static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5357 {
5358   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5359   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5360   { NULL,                     0,  0, 0,            0 }
5361 };
5362
5363 /* ECOFF swapping routines.  These are used when dealing with the
5364    .mdebug section, which is in the ECOFF debugging format.  Copied
5365    from elf32-mips.c.  */
5366 static const struct ecoff_debug_swap
5367 elf64_alpha_ecoff_debug_swap =
5368 {
5369   /* Symbol table magic number.  */
5370   magicSym2,
5371   /* Alignment of debugging information.  E.g., 4.  */
5372   8,
5373   /* Sizes of external symbolic information.  */
5374   sizeof (struct hdr_ext),
5375   sizeof (struct dnr_ext),
5376   sizeof (struct pdr_ext),
5377   sizeof (struct sym_ext),
5378   sizeof (struct opt_ext),
5379   sizeof (struct fdr_ext),
5380   sizeof (struct rfd_ext),
5381   sizeof (struct ext_ext),
5382   /* Functions to swap in external symbolic data.  */
5383   ecoff_swap_hdr_in,
5384   ecoff_swap_dnr_in,
5385   ecoff_swap_pdr_in,
5386   ecoff_swap_sym_in,
5387   ecoff_swap_opt_in,
5388   ecoff_swap_fdr_in,
5389   ecoff_swap_rfd_in,
5390   ecoff_swap_ext_in,
5391   _bfd_ecoff_swap_tir_in,
5392   _bfd_ecoff_swap_rndx_in,
5393   /* Functions to swap out external symbolic data.  */
5394   ecoff_swap_hdr_out,
5395   ecoff_swap_dnr_out,
5396   ecoff_swap_pdr_out,
5397   ecoff_swap_sym_out,
5398   ecoff_swap_opt_out,
5399   ecoff_swap_fdr_out,
5400   ecoff_swap_rfd_out,
5401   ecoff_swap_ext_out,
5402   _bfd_ecoff_swap_tir_out,
5403   _bfd_ecoff_swap_rndx_out,
5404   /* Function to read in symbolic data.  */
5405   elf64_alpha_read_ecoff_info
5406 };
5407 \f
5408 /* Use a non-standard hash bucket size of 8.  */
5409
5410 static const struct elf_size_info alpha_elf_size_info =
5411 {
5412   sizeof (Elf64_External_Ehdr),
5413   sizeof (Elf64_External_Phdr),
5414   sizeof (Elf64_External_Shdr),
5415   sizeof (Elf64_External_Rel),
5416   sizeof (Elf64_External_Rela),
5417   sizeof (Elf64_External_Sym),
5418   sizeof (Elf64_External_Dyn),
5419   sizeof (Elf_External_Note),
5420   8,
5421   1,
5422   64, 3,
5423   ELFCLASS64, EV_CURRENT,
5424   bfd_elf64_write_out_phdrs,
5425   bfd_elf64_write_shdrs_and_ehdr,
5426   bfd_elf64_checksum_contents,
5427   bfd_elf64_write_relocs,
5428   bfd_elf64_swap_symbol_in,
5429   bfd_elf64_swap_symbol_out,
5430   bfd_elf64_slurp_reloc_table,
5431   bfd_elf64_slurp_symbol_table,
5432   bfd_elf64_swap_dyn_in,
5433   bfd_elf64_swap_dyn_out,
5434   bfd_elf64_swap_reloc_in,
5435   bfd_elf64_swap_reloc_out,
5436   bfd_elf64_swap_reloca_in,
5437   bfd_elf64_swap_reloca_out
5438 };
5439
5440 #define TARGET_LITTLE_SYM       alpha_elf64_vec
5441 #define TARGET_LITTLE_NAME      "elf64-alpha"
5442 #define ELF_ARCH                bfd_arch_alpha
5443 #define ELF_TARGET_ID           ALPHA_ELF_DATA
5444 #define ELF_MACHINE_CODE        EM_ALPHA
5445 #define ELF_MAXPAGESIZE 0x10000
5446 #define ELF_COMMONPAGESIZE      0x2000
5447
5448 #define bfd_elf64_bfd_link_hash_table_create \
5449   elf64_alpha_bfd_link_hash_table_create
5450
5451 #define bfd_elf64_bfd_reloc_type_lookup \
5452   elf64_alpha_bfd_reloc_type_lookup
5453 #define bfd_elf64_bfd_reloc_name_lookup \
5454   elf64_alpha_bfd_reloc_name_lookup
5455 #define elf_info_to_howto \
5456   elf64_alpha_info_to_howto
5457
5458 #define bfd_elf64_mkobject \
5459   elf64_alpha_mkobject
5460 #define elf_backend_object_p \
5461   elf64_alpha_object_p
5462
5463 #define elf_backend_section_from_shdr \
5464   elf64_alpha_section_from_shdr
5465 #define elf_backend_section_flags \
5466   elf64_alpha_section_flags
5467 #define elf_backend_fake_sections \
5468   elf64_alpha_fake_sections
5469
5470 #define bfd_elf64_bfd_is_local_label_name \
5471   elf64_alpha_is_local_label_name
5472 #define bfd_elf64_find_nearest_line \
5473   elf64_alpha_find_nearest_line
5474 #define bfd_elf64_bfd_relax_section \
5475   elf64_alpha_relax_section
5476
5477 #define elf_backend_add_symbol_hook \
5478   elf64_alpha_add_symbol_hook
5479 #define elf_backend_relocs_compatible \
5480   _bfd_elf_relocs_compatible
5481 #define elf_backend_sort_relocs_p \
5482   elf64_alpha_sort_relocs_p
5483 #define elf_backend_check_relocs \
5484   elf64_alpha_check_relocs
5485 #define elf_backend_create_dynamic_sections \
5486   elf64_alpha_create_dynamic_sections
5487 #define elf_backend_adjust_dynamic_symbol \
5488   elf64_alpha_adjust_dynamic_symbol
5489 #define elf_backend_merge_symbol_attribute \
5490   elf64_alpha_merge_symbol_attribute
5491 #define elf_backend_copy_indirect_symbol \
5492   elf64_alpha_copy_indirect_symbol
5493 #define elf_backend_always_size_sections \
5494   elf64_alpha_always_size_sections
5495 #define elf_backend_size_dynamic_sections \
5496   elf64_alpha_size_dynamic_sections
5497 #define elf_backend_omit_section_dynsym \
5498   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5499 #define elf_backend_relocate_section \
5500   elf64_alpha_relocate_section
5501 #define elf_backend_finish_dynamic_symbol \
5502   elf64_alpha_finish_dynamic_symbol
5503 #define elf_backend_finish_dynamic_sections \
5504   elf64_alpha_finish_dynamic_sections
5505 #define bfd_elf64_bfd_final_link \
5506   elf64_alpha_final_link
5507 #define elf_backend_reloc_type_class \
5508   elf64_alpha_reloc_type_class
5509
5510 #define elf_backend_can_gc_sections     1
5511 #define elf_backend_gc_mark_hook        elf64_alpha_gc_mark_hook
5512
5513 #define elf_backend_ecoff_debug_swap \
5514   &elf64_alpha_ecoff_debug_swap
5515
5516 #define elf_backend_size_info \
5517   alpha_elf_size_info
5518
5519 #define elf_backend_special_sections \
5520   elf64_alpha_special_sections
5521
5522 /* A few constants that determine how the .plt section is set up.  */
5523 #define elf_backend_want_got_plt 0
5524 #define elf_backend_plt_readonly 0
5525 #define elf_backend_want_plt_sym 1
5526 #define elf_backend_got_header_size 0
5527 #define elf_backend_dtrel_excludes_plt 1
5528
5529 #include "elf64-target.h"
5530 \f
5531 /* FreeBSD support.  */
5532
5533 #undef TARGET_LITTLE_SYM
5534 #define TARGET_LITTLE_SYM       alpha_elf64_fbsd_vec
5535 #undef TARGET_LITTLE_NAME
5536 #define TARGET_LITTLE_NAME      "elf64-alpha-freebsd"
5537 #undef  ELF_OSABI
5538 #define ELF_OSABI               ELFOSABI_FREEBSD
5539
5540 /* The kernel recognizes executables as valid only if they carry a
5541    "FreeBSD" label in the ELF header.  So we put this label on all
5542    executables and (for simplicity) also all other object files.  */
5543
5544 static void
5545 elf64_alpha_fbsd_post_process_headers (bfd * abfd,
5546         struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
5547 {
5548   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
5549
5550   i_ehdrp = elf_elfheader (abfd);
5551
5552   /* Put an ABI label supported by FreeBSD >= 4.1.  */
5553   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5554 #ifdef OLD_FREEBSD_ABI_LABEL
5555   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5556   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5557 #endif
5558 }
5559
5560 #undef elf_backend_post_process_headers
5561 #define elf_backend_post_process_headers \
5562   elf64_alpha_fbsd_post_process_headers
5563
5564 #undef  elf64_bed
5565 #define elf64_bed elf64_alpha_fbsd_bed
5566
5567 #include "elf64-target.h"