ELF: Call check_relocs after opening all inputs
[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.root.non_ir_ref_regular = 1;
1842           h->root.ref_regular = 1;
1843         }
1844
1845       /* We can only get preliminary data on whether a symbol is
1846          locally or externally defined, as not all of the input files
1847          have yet been processed.  Do something with what we know, as
1848          this may help reduce memory usage and processing time later.  */
1849       maybe_dynamic = FALSE;
1850       if (h && ((bfd_link_pic (info)
1851                  && (!info->symbolic
1852                      || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1853                 || !h->root.def_regular
1854                 || h->root.root.type == bfd_link_hash_defweak))
1855         maybe_dynamic = TRUE;
1856
1857       need = 0;
1858       gotent_flags = 0;
1859       r_type = ELF64_R_TYPE (rel->r_info);
1860       addend = rel->r_addend;
1861
1862       switch (r_type)
1863         {
1864         case R_ALPHA_LITERAL:
1865           need = NEED_GOT | NEED_GOT_ENTRY;
1866
1867           /* Remember how this literal is used from its LITUSEs.
1868              This will be important when it comes to decide if we can
1869              create a .plt entry for a function symbol.  */
1870           while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
1871             if (rel->r_addend >= 1 && rel->r_addend <= 6)
1872               gotent_flags |= 1 << rel->r_addend;
1873           --rel;
1874
1875           /* No LITUSEs -- presumably the address is used somehow.  */
1876           if (gotent_flags == 0)
1877             gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
1878           break;
1879
1880         case R_ALPHA_GPDISP:
1881         case R_ALPHA_GPREL16:
1882         case R_ALPHA_GPREL32:
1883         case R_ALPHA_GPRELHIGH:
1884         case R_ALPHA_GPRELLOW:
1885         case R_ALPHA_BRSGP:
1886           need = NEED_GOT;
1887           break;
1888
1889         case R_ALPHA_REFLONG:
1890         case R_ALPHA_REFQUAD:
1891           if (bfd_link_pic (info) || maybe_dynamic)
1892             need = NEED_DYNREL;
1893           break;
1894
1895         case R_ALPHA_TLSLDM:
1896           /* The symbol for a TLSLDM reloc is ignored.  Collapse the
1897              reloc to the STN_UNDEF (0) symbol so that they all match.  */
1898           r_symndx = STN_UNDEF;
1899           h = 0;
1900           maybe_dynamic = FALSE;
1901           /* FALLTHRU */
1902
1903         case R_ALPHA_TLSGD:
1904         case R_ALPHA_GOTDTPREL:
1905           need = NEED_GOT | NEED_GOT_ENTRY;
1906           break;
1907
1908         case R_ALPHA_GOTTPREL:
1909           need = NEED_GOT | NEED_GOT_ENTRY;
1910           gotent_flags = ALPHA_ELF_LINK_HASH_TLS_IE;
1911           if (bfd_link_pic (info))
1912             info->flags |= DF_STATIC_TLS;
1913           break;
1914
1915         case R_ALPHA_TPREL64:
1916           if (bfd_link_dll (info))
1917             {
1918               info->flags |= DF_STATIC_TLS;
1919               need = NEED_DYNREL;
1920             }
1921           else if (maybe_dynamic)
1922             need = NEED_DYNREL;
1923           break;
1924         }
1925
1926       if (need & NEED_GOT)
1927         {
1928           if (alpha_elf_tdata(abfd)->gotobj == NULL)
1929             {
1930               if (!elf64_alpha_create_got_section (abfd, info))
1931                 return FALSE;
1932             }
1933         }
1934
1935       if (need & NEED_GOT_ENTRY)
1936         {
1937           struct alpha_elf_got_entry *gotent;
1938
1939           gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
1940           if (!gotent)
1941             return FALSE;
1942
1943           if (gotent_flags)
1944             {
1945               gotent->flags |= gotent_flags;
1946               if (h)
1947                 {
1948                   gotent_flags |= h->flags;
1949                   h->flags = gotent_flags;
1950
1951                   /* Make a guess as to whether a .plt entry is needed.  */
1952                   /* ??? It appears that we won't make it into
1953                      adjust_dynamic_symbol for symbols that remain
1954                      totally undefined.  Copying this check here means
1955                      we can create a plt entry for them too.  */
1956                   h->root.needs_plt
1957                     = (maybe_dynamic && elf64_alpha_want_plt (h));
1958                 }
1959             }
1960         }
1961
1962       if (need & NEED_DYNREL)
1963         {
1964           /* We need to create the section here now whether we eventually
1965              use it or not so that it gets mapped to an output section by
1966              the linker.  If not used, we'll kill it in size_dynamic_sections.  */
1967           if (sreloc == NULL)
1968             {
1969               sreloc = _bfd_elf_make_dynamic_reloc_section
1970                 (sec, dynobj, 3, abfd, /*rela?*/ TRUE);
1971
1972               if (sreloc == NULL)
1973                 return FALSE;
1974             }
1975
1976           if (h)
1977             {
1978               /* Since we havn't seen all of the input symbols yet, we
1979                  don't know whether we'll actually need a dynamic relocation
1980                  entry for this reloc.  So make a record of it.  Once we
1981                  find out if this thing needs dynamic relocation we'll
1982                  expand the relocation sections by the appropriate amount.  */
1983
1984               struct alpha_elf_reloc_entry *rent;
1985
1986               for (rent = h->reloc_entries; rent; rent = rent->next)
1987                 if (rent->rtype == r_type && rent->srel == sreloc)
1988                   break;
1989
1990               if (!rent)
1991                 {
1992                   amt = sizeof (struct alpha_elf_reloc_entry);
1993                   rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
1994                   if (!rent)
1995                     return FALSE;
1996
1997                   rent->srel = sreloc;
1998                   rent->rtype = r_type;
1999                   rent->count = 1;
2000                   rent->reltext = (sec->flags & SEC_READONLY) != 0;
2001
2002                   rent->next = h->reloc_entries;
2003                   h->reloc_entries = rent;
2004                 }
2005               else
2006                 rent->count++;
2007             }
2008           else if (bfd_link_pic (info))
2009             {
2010               /* If this is a shared library, and the section is to be
2011                  loaded into memory, we need a RELATIVE reloc.  */
2012               sreloc->size += sizeof (Elf64_External_Rela);
2013               if (sec->flags & SEC_READONLY)
2014                 info->flags |= DF_TEXTREL;
2015             }
2016         }
2017     }
2018
2019   return TRUE;
2020 }
2021
2022 /* Return the section that should be marked against GC for a given
2023    relocation.  */
2024
2025 static asection *
2026 elf64_alpha_gc_mark_hook (asection *sec, struct bfd_link_info *info,
2027                           Elf_Internal_Rela *rel,
2028                           struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
2029 {
2030   /* These relocations don't really reference a symbol.  Instead we store
2031      extra data in their addend slot.  Ignore the symbol.  */
2032   switch (ELF64_R_TYPE (rel->r_info))
2033     {
2034     case R_ALPHA_LITUSE:
2035     case R_ALPHA_GPDISP:
2036     case R_ALPHA_HINT:
2037       return NULL;
2038     }
2039
2040   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2041 }
2042
2043 /* Adjust a symbol defined by a dynamic object and referenced by a
2044    regular object.  The current definition is in some section of the
2045    dynamic object, but we're not including those sections.  We have to
2046    change the definition to something the rest of the link can
2047    understand.  */
2048
2049 static bfd_boolean
2050 elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info *info,
2051                                    struct elf_link_hash_entry *h)
2052 {
2053   bfd *dynobj;
2054   asection *s;
2055   struct alpha_elf_link_hash_entry *ah;
2056
2057   dynobj = elf_hash_table(info)->dynobj;
2058   ah = (struct alpha_elf_link_hash_entry *)h;
2059
2060   /* Now that we've seen all of the input symbols, finalize our decision
2061      about whether this symbol should get a .plt entry.  Irritatingly, it
2062      is common for folk to leave undefined symbols in shared libraries,
2063      and they still expect lazy binding; accept undefined symbols in lieu
2064      of STT_FUNC.  */
2065   if (alpha_elf_dynamic_symbol_p (h, info) && elf64_alpha_want_plt (ah))
2066     {
2067       h->needs_plt = TRUE;
2068
2069       s = elf_hash_table(info)->splt;
2070       if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2071         return FALSE;
2072
2073       /* We need one plt entry per got subsection.  Delay allocation of
2074          the actual plt entries until size_plt_section, called from
2075          size_dynamic_sections or during relaxation.  */
2076
2077       return TRUE;
2078     }
2079   else
2080     h->needs_plt = FALSE;
2081
2082   /* If this is a weak symbol, and there is a real definition, the
2083      processor independent code will have arranged for us to see the
2084      real definition first, and we can just use the same value.  */
2085   if (h->u.weakdef != NULL)
2086     {
2087       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2088                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2089       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2090       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2091       return TRUE;
2092     }
2093
2094   /* This is a reference to a symbol defined by a dynamic object which
2095      is not a function.  The Alpha, since it uses .got entries for all
2096      symbols even in regular objects, does not need the hackery of a
2097      .dynbss section and COPY dynamic relocations.  */
2098
2099   return TRUE;
2100 }
2101
2102 /* Record STO_ALPHA_NOPV and STO_ALPHA_STD_GPLOAD.  */
2103
2104 static void
2105 elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
2106                                     const Elf_Internal_Sym *isym,
2107                                     bfd_boolean definition,
2108                                     bfd_boolean dynamic)
2109 {
2110   if (!dynamic && definition)
2111     h->other = ((h->other & ELF_ST_VISIBILITY (-1))
2112                 | (isym->st_other & ~ELF_ST_VISIBILITY (-1)));
2113 }
2114
2115 /* Symbol versioning can create new symbols, and make our old symbols
2116    indirect to the new ones.  Consolidate the got and reloc information
2117    in these situations.  */
2118
2119 static void
2120 elf64_alpha_copy_indirect_symbol (struct bfd_link_info *info,
2121                                   struct elf_link_hash_entry *dir,
2122                                   struct elf_link_hash_entry *ind)
2123 {
2124   struct alpha_elf_link_hash_entry *hi
2125     = (struct alpha_elf_link_hash_entry *) ind;
2126   struct alpha_elf_link_hash_entry *hs
2127     = (struct alpha_elf_link_hash_entry *) dir;
2128
2129   /* Do the merging in the superclass.  */
2130   _bfd_elf_link_hash_copy_indirect(info, dir, ind);
2131
2132   /* Merge the flags.  Whee.  */
2133   hs->flags |= hi->flags;
2134
2135   /* ??? It's unclear to me what's really supposed to happen when
2136      "merging" defweak and defined symbols, given that we don't
2137      actually throw away the defweak.  This more-or-less copies
2138      the logic related to got and plt entries in the superclass.  */
2139   if (ind->root.type != bfd_link_hash_indirect)
2140     return;
2141
2142   /* Merge the .got entries.  Cannibalize the old symbol's list in
2143      doing so, since we don't need it anymore.  */
2144
2145   if (hs->got_entries == NULL)
2146     hs->got_entries = hi->got_entries;
2147   else
2148     {
2149       struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2150
2151       gsh = hs->got_entries;
2152       for (gi = hi->got_entries; gi ; gi = gin)
2153         {
2154           gin = gi->next;
2155           for (gs = gsh; gs ; gs = gs->next)
2156             if (gi->gotobj == gs->gotobj
2157                 && gi->reloc_type == gs->reloc_type
2158                 && gi->addend == gs->addend)
2159               {
2160                 gs->use_count += gi->use_count;
2161                 goto got_found;
2162               }
2163           gi->next = hs->got_entries;
2164           hs->got_entries = gi;
2165         got_found:;
2166         }
2167     }
2168   hi->got_entries = NULL;
2169
2170   /* And similar for the reloc entries.  */
2171
2172   if (hs->reloc_entries == NULL)
2173     hs->reloc_entries = hi->reloc_entries;
2174   else
2175     {
2176       struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2177
2178       rsh = hs->reloc_entries;
2179       for (ri = hi->reloc_entries; ri ; ri = rin)
2180         {
2181           rin = ri->next;
2182           for (rs = rsh; rs ; rs = rs->next)
2183             if (ri->rtype == rs->rtype && ri->srel == rs->srel)
2184               {
2185                 rs->count += ri->count;
2186                 goto found_reloc;
2187               }
2188           ri->next = hs->reloc_entries;
2189           hs->reloc_entries = ri;
2190         found_reloc:;
2191         }
2192     }
2193   hi->reloc_entries = NULL;
2194 }
2195
2196 /* Is it possible to merge two object file's .got tables?  */
2197
2198 static bfd_boolean
2199 elf64_alpha_can_merge_gots (bfd *a, bfd *b)
2200 {
2201   int total = alpha_elf_tdata (a)->total_got_size;
2202   bfd *bsub;
2203
2204   /* Trivial quick fallout test.  */
2205   if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2206     return TRUE;
2207
2208   /* By their nature, local .got entries cannot be merged.  */
2209   if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
2210     return FALSE;
2211
2212   /* Failing the common trivial comparison, we must effectively
2213      perform the merge.  Not actually performing the merge means that
2214      we don't have to store undo information in case we fail.  */
2215   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2216     {
2217       struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2218       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2219       int i, n;
2220
2221       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2222       for (i = 0; i < n; ++i)
2223         {
2224           struct alpha_elf_got_entry *ae, *be;
2225           struct alpha_elf_link_hash_entry *h;
2226
2227           h = hashes[i];
2228           while (h->root.root.type == bfd_link_hash_indirect
2229                  || h->root.root.type == bfd_link_hash_warning)
2230             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2231
2232           for (be = h->got_entries; be ; be = be->next)
2233             {
2234               if (be->use_count == 0)
2235                 continue;
2236               if (be->gotobj != b)
2237                 continue;
2238
2239               for (ae = h->got_entries; ae ; ae = ae->next)
2240                 if (ae->gotobj == a
2241                     && ae->reloc_type == be->reloc_type
2242                     && ae->addend == be->addend)
2243                   goto global_found;
2244
2245               total += alpha_got_entry_size (be->reloc_type);
2246               if (total > MAX_GOT_SIZE)
2247                 return FALSE;
2248             global_found:;
2249             }
2250         }
2251     }
2252
2253   return TRUE;
2254 }
2255
2256 /* Actually merge two .got tables.  */
2257
2258 static void
2259 elf64_alpha_merge_gots (bfd *a, bfd *b)
2260 {
2261   int total = alpha_elf_tdata (a)->total_got_size;
2262   bfd *bsub;
2263
2264   /* Remember local expansion.  */
2265   {
2266     int e = alpha_elf_tdata (b)->local_got_size;
2267     total += e;
2268     alpha_elf_tdata (a)->local_got_size += e;
2269   }
2270
2271   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2272     {
2273       struct alpha_elf_got_entry **local_got_entries;
2274       struct alpha_elf_link_hash_entry **hashes;
2275       Elf_Internal_Shdr *symtab_hdr;
2276       int i, n;
2277
2278       /* Let the local .got entries know they are part of a new subsegment.  */
2279       local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2280       if (local_got_entries)
2281         {
2282           n = elf_tdata (bsub)->symtab_hdr.sh_info;
2283           for (i = 0; i < n; ++i)
2284             {
2285               struct alpha_elf_got_entry *ent;
2286               for (ent = local_got_entries[i]; ent; ent = ent->next)
2287                 ent->gotobj = a;
2288             }
2289         }
2290
2291       /* Merge the global .got entries.  */
2292       hashes = alpha_elf_sym_hashes (bsub);
2293       symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2294
2295       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2296       for (i = 0; i < n; ++i)
2297         {
2298           struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2299           struct alpha_elf_link_hash_entry *h;
2300
2301           h = hashes[i];
2302           while (h->root.root.type == bfd_link_hash_indirect
2303                  || h->root.root.type == bfd_link_hash_warning)
2304             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2305
2306           pbe = start = &h->got_entries;
2307           while ((be = *pbe) != NULL)
2308             {
2309               if (be->use_count == 0)
2310                 {
2311                   *pbe = be->next;
2312                   memset (be, 0xa5, sizeof (*be));
2313                   goto kill;
2314                 }
2315               if (be->gotobj != b)
2316                 goto next;
2317
2318               for (ae = *start; ae ; ae = ae->next)
2319                 if (ae->gotobj == a
2320                     && ae->reloc_type == be->reloc_type
2321                     && ae->addend == be->addend)
2322                   {
2323                     ae->flags |= be->flags;
2324                     ae->use_count += be->use_count;
2325                     *pbe = be->next;
2326                     memset (be, 0xa5, sizeof (*be));
2327                     goto kill;
2328                   }
2329               be->gotobj = a;
2330               total += alpha_got_entry_size (be->reloc_type);
2331
2332             next:;
2333               pbe = &be->next;
2334             kill:;
2335             }
2336         }
2337
2338       alpha_elf_tdata (bsub)->gotobj = a;
2339     }
2340   alpha_elf_tdata (a)->total_got_size = total;
2341
2342   /* Merge the two in_got chains.  */
2343   {
2344     bfd *next;
2345
2346     bsub = a;
2347     while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2348       bsub = next;
2349
2350     alpha_elf_tdata (bsub)->in_got_link_next = b;
2351   }
2352 }
2353
2354 /* Calculate the offsets for the got entries.  */
2355
2356 static bfd_boolean
2357 elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry *h,
2358                                          void * arg ATTRIBUTE_UNUSED)
2359 {
2360   struct alpha_elf_got_entry *gotent;
2361
2362   for (gotent = h->got_entries; gotent; gotent = gotent->next)
2363     if (gotent->use_count > 0)
2364       {
2365         struct alpha_elf_obj_tdata *td;
2366         bfd_size_type *plge;
2367
2368         td = alpha_elf_tdata (gotent->gotobj);
2369         plge = &td->got->size;
2370         gotent->got_offset = *plge;
2371         *plge += alpha_got_entry_size (gotent->reloc_type);
2372       }
2373
2374   return TRUE;
2375 }
2376
2377 static void
2378 elf64_alpha_calc_got_offsets (struct bfd_link_info *info)
2379 {
2380   bfd *i, *got_list;
2381   struct alpha_elf_link_hash_table * htab;
2382
2383   htab = alpha_elf_hash_table (info);
2384   if (htab == NULL)
2385     return;
2386   got_list = htab->got_list;
2387
2388   /* First, zero out the .got sizes, as we may be recalculating the
2389      .got after optimizing it.  */
2390   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2391     alpha_elf_tdata(i)->got->size = 0;
2392
2393   /* Next, fill in the offsets for all the global entries.  */
2394   alpha_elf_link_hash_traverse (htab,
2395                                 elf64_alpha_calc_got_offsets_for_symbol,
2396                                 NULL);
2397
2398   /* Finally, fill in the offsets for the local entries.  */
2399   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2400     {
2401       bfd_size_type got_offset = alpha_elf_tdata(i)->got->size;
2402       bfd *j;
2403
2404       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2405         {
2406           struct alpha_elf_got_entry **local_got_entries, *gotent;
2407           int k, n;
2408
2409           local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2410           if (!local_got_entries)
2411             continue;
2412
2413           for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2414             for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2415               if (gotent->use_count > 0)
2416                 {
2417                   gotent->got_offset = got_offset;
2418                   got_offset += alpha_got_entry_size (gotent->reloc_type);
2419                 }
2420         }
2421
2422       alpha_elf_tdata(i)->got->size = got_offset;
2423     }
2424 }
2425
2426 /* Constructs the gots.  */
2427
2428 static bfd_boolean
2429 elf64_alpha_size_got_sections (struct bfd_link_info *info,
2430                                bfd_boolean may_merge)
2431 {
2432   bfd *i, *got_list, *cur_got_obj = NULL;
2433   struct alpha_elf_link_hash_table * htab;
2434
2435   htab = alpha_elf_hash_table (info);
2436   if (htab == NULL)
2437     return FALSE;
2438   got_list = htab->got_list;
2439
2440   /* On the first time through, pretend we have an existing got list
2441      consisting of all of the input files.  */
2442   if (got_list == NULL)
2443     {
2444       for (i = info->input_bfds; i ; i = i->link.next)
2445         {
2446           bfd *this_got;
2447
2448           if (! is_alpha_elf (i))
2449             continue;
2450
2451           this_got = alpha_elf_tdata (i)->gotobj;
2452           if (this_got == NULL)
2453             continue;
2454
2455           /* We are assuming no merging has yet occurred.  */
2456           BFD_ASSERT (this_got == i);
2457
2458           if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
2459             {
2460               /* Yikes! A single object file has too many entries.  */
2461               _bfd_error_handler
2462                 /* xgettext:c-format */
2463                 (_("%B: .got subsegment exceeds 64K (size %d)"),
2464                  i, alpha_elf_tdata (this_got)->total_got_size);
2465               return FALSE;
2466             }
2467
2468           if (got_list == NULL)
2469             got_list = this_got;
2470           else
2471             alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
2472           cur_got_obj = this_got;
2473         }
2474
2475       /* Strange degenerate case of no got references.  */
2476       if (got_list == NULL)
2477         return TRUE;
2478
2479       htab->got_list = got_list;
2480     }
2481
2482   cur_got_obj = got_list;
2483   if (cur_got_obj == NULL)
2484     return FALSE;
2485
2486   if (may_merge)
2487     {
2488       i = alpha_elf_tdata(cur_got_obj)->got_link_next;
2489       while (i != NULL)
2490         {
2491           if (elf64_alpha_can_merge_gots (cur_got_obj, i))
2492             {
2493               elf64_alpha_merge_gots (cur_got_obj, i);
2494
2495               alpha_elf_tdata(i)->got->size = 0;
2496               i = alpha_elf_tdata(i)->got_link_next;
2497               alpha_elf_tdata(cur_got_obj)->got_link_next = i;
2498             }
2499           else
2500             {
2501               cur_got_obj = i;
2502               i = alpha_elf_tdata(i)->got_link_next;
2503             }
2504         }
2505     }
2506
2507   /* Once the gots have been merged, fill in the got offsets for
2508      everything therein.  */
2509   elf64_alpha_calc_got_offsets (info);
2510
2511   return TRUE;
2512 }
2513
2514 static bfd_boolean
2515 elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry *h,
2516                                 void * data)
2517 {
2518   asection *splt = (asection *) data;
2519   struct alpha_elf_got_entry *gotent;
2520   bfd_boolean saw_one = FALSE;
2521
2522   /* If we didn't need an entry before, we still don't.  */
2523   if (!h->root.needs_plt)
2524     return TRUE;
2525
2526   /* For each LITERAL got entry still in use, allocate a plt entry.  */
2527   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2528     if (gotent->reloc_type == R_ALPHA_LITERAL
2529         && gotent->use_count > 0)
2530       {
2531         if (splt->size == 0)
2532           splt->size = PLT_HEADER_SIZE;
2533         gotent->plt_offset = splt->size;
2534         splt->size += PLT_ENTRY_SIZE;
2535         saw_one = TRUE;
2536       }
2537
2538   /* If there weren't any, there's no longer a need for the PLT entry.  */
2539   if (!saw_one)
2540     h->root.needs_plt = FALSE;
2541
2542   return TRUE;
2543 }
2544
2545 /* Called from relax_section to rebuild the PLT in light of potential changes
2546    in the function's status.  */
2547
2548 static void
2549 elf64_alpha_size_plt_section (struct bfd_link_info *info)
2550 {
2551   asection *splt, *spltrel, *sgotplt;
2552   unsigned long entries;
2553   struct alpha_elf_link_hash_table * htab;
2554
2555   htab = alpha_elf_hash_table (info);
2556   if (htab == NULL)
2557     return;
2558
2559   splt = elf_hash_table(info)->splt;
2560   if (splt == NULL)
2561     return;
2562
2563   splt->size = 0;
2564
2565   alpha_elf_link_hash_traverse (htab,
2566                                 elf64_alpha_size_plt_section_1, splt);
2567
2568   /* Every plt entry requires a JMP_SLOT relocation.  */
2569   spltrel = elf_hash_table(info)->srelplt;
2570   entries = 0;
2571   if (splt->size)
2572     {
2573       if (elf64_alpha_use_secureplt)
2574         entries = (splt->size - NEW_PLT_HEADER_SIZE) / NEW_PLT_ENTRY_SIZE;
2575       else
2576         entries = (splt->size - OLD_PLT_HEADER_SIZE) / OLD_PLT_ENTRY_SIZE;
2577     }
2578   spltrel->size = entries * sizeof (Elf64_External_Rela);
2579
2580   /* When using the secureplt, we need two words somewhere in the data
2581      segment for the dynamic linker to tell us where to go.  This is the
2582      entire contents of the .got.plt section.  */
2583   if (elf64_alpha_use_secureplt)
2584     {
2585       sgotplt = elf_hash_table(info)->sgotplt;
2586       sgotplt->size = entries ? 16 : 0;
2587     }
2588 }
2589
2590 static bfd_boolean
2591 elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2592                                   struct bfd_link_info *info)
2593 {
2594   bfd *i;
2595   struct alpha_elf_link_hash_table * htab;
2596
2597   if (bfd_link_relocatable (info))
2598     return TRUE;
2599
2600   htab = alpha_elf_hash_table (info);
2601   if (htab == NULL)
2602     return FALSE;
2603
2604   if (!elf64_alpha_size_got_sections (info, TRUE))
2605     return FALSE;
2606
2607   /* Allocate space for all of the .got subsections.  */
2608   i = htab->got_list;
2609   for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
2610     {
2611       asection *s = alpha_elf_tdata(i)->got;
2612       if (s->size > 0)
2613         {
2614           s->contents = (bfd_byte *) bfd_zalloc (i, s->size);
2615           if (s->contents == NULL)
2616             return FALSE;
2617         }
2618     }
2619
2620   return TRUE;
2621 }
2622
2623 /* The number of dynamic relocations required by a static relocation.  */
2624
2625 static int
2626 alpha_dynamic_entries_for_reloc (int r_type, int dynamic, int shared, int pie)
2627 {
2628   switch (r_type)
2629     {
2630     /* May appear in GOT entries.  */
2631     case R_ALPHA_TLSGD:
2632       return (dynamic ? 2 : shared ? 1 : 0);
2633     case R_ALPHA_TLSLDM:
2634       return shared;
2635     case R_ALPHA_LITERAL:
2636       return dynamic || shared;
2637     case R_ALPHA_GOTTPREL:
2638       return dynamic || (shared && !pie);
2639     case R_ALPHA_GOTDTPREL:
2640       return dynamic;
2641
2642     /* May appear in data sections.  */
2643     case R_ALPHA_REFLONG:
2644     case R_ALPHA_REFQUAD:
2645       return dynamic || shared;
2646     case R_ALPHA_TPREL64:
2647       return dynamic || (shared && !pie);
2648
2649     /* Everything else is illegal.  We'll issue an error during
2650        relocate_section.  */
2651     default:
2652       return 0;
2653     }
2654 }
2655
2656 /* Work out the sizes of the dynamic relocation entries.  */
2657
2658 static bfd_boolean
2659 elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
2660                                struct bfd_link_info *info)
2661 {
2662   bfd_boolean dynamic;
2663   struct alpha_elf_reloc_entry *relent;
2664   unsigned long entries;
2665
2666   /* If the symbol was defined as a common symbol in a regular object
2667      file, and there was no definition in any dynamic object, then the
2668      linker will have allocated space for the symbol in a common
2669      section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2670      set.  This is done for dynamic symbols in
2671      elf_adjust_dynamic_symbol but this is not done for non-dynamic
2672      symbols, somehow.  */
2673   if (!h->root.def_regular
2674       && h->root.ref_regular
2675       && !h->root.def_dynamic
2676       && (h->root.root.type == bfd_link_hash_defined
2677           || h->root.root.type == bfd_link_hash_defweak)
2678       && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
2679     h->root.def_regular = 1;
2680
2681   /* If the symbol is dynamic, we'll need all the relocations in their
2682      natural form.  If this is a shared object, and it has been forced
2683      local, we'll need the same number of RELATIVE relocations.  */
2684   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2685
2686   /* If the symbol is a hidden undefined weak, then we never have any
2687      relocations.  Avoid the loop which may want to add RELATIVE relocs
2688      based on bfd_link_pic (info).  */
2689   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2690     return TRUE;
2691
2692   for (relent = h->reloc_entries; relent; relent = relent->next)
2693     {
2694       entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
2695                                                  bfd_link_pic (info),
2696                                                  bfd_link_pie (info));
2697       if (entries)
2698         {
2699           relent->srel->size +=
2700             entries * sizeof (Elf64_External_Rela) * relent->count;
2701           if (relent->reltext)
2702             info->flags |= DT_TEXTREL;
2703         }
2704     }
2705
2706   return TRUE;
2707 }
2708
2709 /* Subroutine of elf64_alpha_size_rela_got_section for doing the
2710    global symbols.  */
2711
2712 static bfd_boolean
2713 elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry *h,
2714                              struct bfd_link_info *info)
2715 {
2716   bfd_boolean dynamic;
2717   struct alpha_elf_got_entry *gotent;
2718   unsigned long entries;
2719
2720   /* If we're using a plt for this symbol, then all of its relocations
2721      for its got entries go into .rela.plt.  */
2722   if (h->root.needs_plt)
2723     return TRUE;
2724
2725   /* If the symbol is dynamic, we'll need all the relocations in their
2726      natural form.  If this is a shared object, and it has been forced
2727      local, we'll need the same number of RELATIVE relocations.  */
2728   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2729
2730   /* If the symbol is a hidden undefined weak, then we never have any
2731      relocations.  Avoid the loop which may want to add RELATIVE relocs
2732      based on bfd_link_pic (info).  */
2733   if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2734     return TRUE;
2735
2736   entries = 0;
2737   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2738     if (gotent->use_count > 0)
2739       entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type, dynamic,
2740                                                   bfd_link_pic (info),
2741                                                   bfd_link_pie (info));
2742
2743   if (entries > 0)
2744     {
2745       asection *srel = elf_hash_table(info)->srelgot;
2746       BFD_ASSERT (srel != NULL);
2747       srel->size += sizeof (Elf64_External_Rela) * entries;
2748     }
2749
2750   return TRUE;
2751 }
2752
2753 /* Set the sizes of the dynamic relocation sections.  */
2754
2755 static void
2756 elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
2757 {
2758   unsigned long entries;
2759   bfd *i;
2760   asection *srel;
2761   struct alpha_elf_link_hash_table * htab;
2762
2763   htab = alpha_elf_hash_table (info);
2764   if (htab == NULL)
2765     return;
2766
2767   /* Shared libraries often require RELATIVE relocs, and some relocs
2768      require attention for the main application as well.  */
2769
2770   entries = 0;
2771   for (i = htab->got_list;
2772        i ; i = alpha_elf_tdata(i)->got_link_next)
2773     {
2774       bfd *j;
2775
2776       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2777         {
2778           struct alpha_elf_got_entry **local_got_entries, *gotent;
2779           int k, n;
2780
2781           local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2782           if (!local_got_entries)
2783             continue;
2784
2785           for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2786             for (gotent = local_got_entries[k];
2787                  gotent ; gotent = gotent->next)
2788               if (gotent->use_count > 0)
2789                 entries += (alpha_dynamic_entries_for_reloc
2790                             (gotent->reloc_type, 0, bfd_link_pic (info),
2791                              bfd_link_pie (info)));
2792         }
2793     }
2794
2795   srel = elf_hash_table(info)->srelgot;
2796   if (!srel)
2797     {
2798       BFD_ASSERT (entries == 0);
2799       return;
2800     }
2801   srel->size = sizeof (Elf64_External_Rela) * entries;
2802
2803   /* Now do the non-local symbols.  */
2804   alpha_elf_link_hash_traverse (htab,
2805                                 elf64_alpha_size_rela_got_1, info);
2806 }
2807
2808 /* Set the sizes of the dynamic sections.  */
2809
2810 static bfd_boolean
2811 elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2812                                    struct bfd_link_info *info)
2813 {
2814   bfd *dynobj;
2815   asection *s;
2816   bfd_boolean relplt, relocs;
2817   struct alpha_elf_link_hash_table * htab;
2818
2819   htab = alpha_elf_hash_table (info);
2820   if (htab == NULL)
2821     return FALSE;
2822
2823   dynobj = elf_hash_table(info)->dynobj;
2824   BFD_ASSERT(dynobj != NULL);
2825
2826   if (elf_hash_table (info)->dynamic_sections_created)
2827     {
2828       /* Set the contents of the .interp section to the interpreter.  */
2829       if (bfd_link_executable (info) && !info->nointerp)
2830         {
2831           s = bfd_get_linker_section (dynobj, ".interp");
2832           BFD_ASSERT (s != NULL);
2833           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2834           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2835         }
2836
2837       /* Now that we've seen all of the input files, we can decide which
2838          symbols need dynamic relocation entries and which don't.  We've
2839          collected information in check_relocs that we can now apply to
2840          size the dynamic relocation sections.  */
2841       alpha_elf_link_hash_traverse (htab,
2842                                     elf64_alpha_calc_dynrel_sizes, info);
2843
2844       elf64_alpha_size_rela_got_section (info);
2845       elf64_alpha_size_plt_section (info);
2846     }
2847   /* else we're not dynamic and by definition we don't need such things.  */
2848
2849   /* The check_relocs and adjust_dynamic_symbol entry points have
2850      determined the sizes of the various dynamic sections.  Allocate
2851      memory for them.  */
2852   relplt = FALSE;
2853   relocs = FALSE;
2854   for (s = dynobj->sections; s != NULL; s = s->next)
2855     {
2856       const char *name;
2857
2858       if (!(s->flags & SEC_LINKER_CREATED))
2859         continue;
2860
2861       /* It's OK to base decisions on the section name, because none
2862          of the dynobj section names depend upon the input files.  */
2863       name = bfd_get_section_name (dynobj, s);
2864
2865       if (CONST_STRNEQ (name, ".rela"))
2866         {
2867           if (s->size != 0)
2868             {
2869               if (strcmp (name, ".rela.plt") == 0)
2870                 relplt = TRUE;
2871               else
2872                 relocs = TRUE;
2873
2874               /* We use the reloc_count field as a counter if we need
2875                  to copy relocs into the output file.  */
2876               s->reloc_count = 0;
2877             }
2878         }
2879       else if (! CONST_STRNEQ (name, ".got")
2880                && strcmp (name, ".plt") != 0
2881                && strcmp (name, ".dynbss") != 0)
2882         {
2883           /* It's not one of our dynamic sections, so don't allocate space.  */
2884           continue;
2885         }
2886
2887       if (s->size == 0)
2888         {
2889           /* If we don't need this section, strip it from the output file.
2890              This is to handle .rela.bss and .rela.plt.  We must create it
2891              in create_dynamic_sections, because it must be created before
2892              the linker maps input sections to output sections.  The
2893              linker does that before adjust_dynamic_symbol is called, and
2894              it is that function which decides whether anything needs to
2895              go into these sections.  */
2896           if (!CONST_STRNEQ (name, ".got"))
2897             s->flags |= SEC_EXCLUDE;
2898         }
2899       else if ((s->flags & SEC_HAS_CONTENTS) != 0)
2900         {
2901           /* Allocate memory for the section contents.  */
2902           s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2903           if (s->contents == NULL)
2904             return FALSE;
2905         }
2906     }
2907
2908   if (elf_hash_table (info)->dynamic_sections_created)
2909     {
2910       /* Add some entries to the .dynamic section.  We fill in the
2911          values later, in elf64_alpha_finish_dynamic_sections, but we
2912          must add the entries now so that we get the correct size for
2913          the .dynamic section.  The DT_DEBUG entry is filled in by the
2914          dynamic linker and used by the debugger.  */
2915 #define add_dynamic_entry(TAG, VAL) \
2916   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2917
2918       if (bfd_link_executable (info))
2919         {
2920           if (!add_dynamic_entry (DT_DEBUG, 0))
2921             return FALSE;
2922         }
2923
2924       if (relplt)
2925         {
2926           if (!add_dynamic_entry (DT_PLTGOT, 0)
2927               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2928               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2929               || !add_dynamic_entry (DT_JMPREL, 0))
2930             return FALSE;
2931
2932           if (elf64_alpha_use_secureplt
2933               && !add_dynamic_entry (DT_ALPHA_PLTRO, 1))
2934             return FALSE;
2935         }
2936
2937       if (relocs)
2938         {
2939           if (!add_dynamic_entry (DT_RELA, 0)
2940               || !add_dynamic_entry (DT_RELASZ, 0)
2941               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2942             return FALSE;
2943
2944           if (info->flags & DF_TEXTREL)
2945             {
2946               if (!add_dynamic_entry (DT_TEXTREL, 0))
2947                 return FALSE;
2948             }
2949         }
2950     }
2951 #undef add_dynamic_entry
2952
2953   return TRUE;
2954 }
2955 \f
2956 /* These functions do relaxation for Alpha ELF.
2957
2958    Currently I'm only handling what I can do with existing compiler
2959    and assembler support, which means no instructions are removed,
2960    though some may be nopped.  At this time GCC does not emit enough
2961    information to do all of the relaxing that is possible.  It will
2962    take some not small amount of work for that to happen.
2963
2964    There are a couple of interesting papers that I once read on this
2965    subject, that I cannot find references to at the moment, that
2966    related to Alpha in particular.  They are by David Wall, then of
2967    DEC WRL.  */
2968
2969 struct alpha_relax_info
2970 {
2971   bfd *abfd;
2972   asection *sec;
2973   bfd_byte *contents;
2974   Elf_Internal_Shdr *symtab_hdr;
2975   Elf_Internal_Rela *relocs, *relend;
2976   struct bfd_link_info *link_info;
2977   bfd_vma gp;
2978   bfd *gotobj;
2979   asection *tsec;
2980   struct alpha_elf_link_hash_entry *h;
2981   struct alpha_elf_got_entry **first_gotent;
2982   struct alpha_elf_got_entry *gotent;
2983   bfd_boolean changed_contents;
2984   bfd_boolean changed_relocs;
2985   unsigned char other;
2986 };
2987
2988 static Elf_Internal_Rela *
2989 elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela *rel,
2990                                Elf_Internal_Rela *relend,
2991                                bfd_vma offset, int type)
2992 {
2993   while (rel < relend)
2994     {
2995       if (rel->r_offset == offset
2996           && ELF64_R_TYPE (rel->r_info) == (unsigned int) type)
2997         return rel;
2998       ++rel;
2999     }
3000   return NULL;
3001 }
3002
3003 static bfd_boolean
3004 elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
3005                             Elf_Internal_Rela *irel, unsigned long r_type)
3006 {
3007   unsigned int insn;
3008   bfd_signed_vma disp;
3009
3010   /* Get the instruction.  */
3011   insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
3012
3013   if (insn >> 26 != OP_LDQ)
3014     {
3015       reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
3016       _bfd_error_handler
3017         /* xgettext:c-format */
3018         (_("%B: %A+%#Lx: warning: %s relocation against unexpected insn"),
3019          info->abfd, info->sec, irel->r_offset, howto->name);
3020       return TRUE;
3021     }
3022
3023   /* Can't relax dynamic symbols.  */
3024   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3025     return TRUE;
3026
3027   /* Can't use local-exec relocations in shared libraries.  */
3028   if (r_type == R_ALPHA_GOTTPREL
3029       && bfd_link_dll (info->link_info))
3030     return TRUE;
3031
3032   if (r_type == R_ALPHA_LITERAL)
3033     {
3034       /* Look for nice constant addresses.  This includes the not-uncommon
3035          special case of 0 for undefweak symbols.  */
3036       if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3037           || (!bfd_link_pic (info->link_info)
3038               && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3039         {
3040           disp = 0;
3041           insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3042           insn |= (symval & 0xffff);
3043           r_type = R_ALPHA_NONE;
3044         }
3045       else
3046         {
3047           /* We may only create GPREL relocs during the second pass.  */
3048           if (info->link_info->relax_pass == 0)
3049             return TRUE;
3050
3051           disp = symval - info->gp;
3052           insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3053           r_type = R_ALPHA_GPREL16;
3054         }
3055     }
3056   else
3057     {
3058       bfd_vma dtp_base, tp_base;
3059
3060       BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3061       dtp_base = alpha_get_dtprel_base (info->link_info);
3062       tp_base = alpha_get_tprel_base (info->link_info);
3063       disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3064
3065       insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3066
3067       switch (r_type)
3068         {
3069         case R_ALPHA_GOTDTPREL:
3070           r_type = R_ALPHA_DTPREL16;
3071           break;
3072         case R_ALPHA_GOTTPREL:
3073           r_type = R_ALPHA_TPREL16;
3074           break;
3075         default:
3076           BFD_ASSERT (0);
3077           return FALSE;
3078         }
3079     }
3080
3081   if (disp < -0x8000 || disp >= 0x8000)
3082     return TRUE;
3083
3084   bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3085   info->changed_contents = TRUE;
3086
3087   /* Reduce the use count on this got entry by one, possibly
3088      eliminating it.  */
3089   if (--info->gotent->use_count == 0)
3090     {
3091       int sz = alpha_got_entry_size (r_type);
3092       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3093       if (!info->h)
3094         alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3095     }
3096
3097   /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3098   irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3099   info->changed_relocs = TRUE;
3100
3101   /* ??? Search forward through this basic block looking for insns
3102      that use the target register.  Stop after an insn modifying the
3103      register is seen, or after a branch or call.
3104
3105      Any such memory load insn may be substituted by a load directly
3106      off the GP.  This allows the memory load insn to be issued before
3107      the calculated GP register would otherwise be ready.
3108
3109      Any such jsr insn can be replaced by a bsr if it is in range.
3110
3111      This would mean that we'd have to _add_ relocations, the pain of
3112      which gives one pause.  */
3113
3114   return TRUE;
3115 }
3116
3117 static bfd_vma
3118 elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3119 {
3120   /* If the function has the same gp, and we can identify that the
3121      function does not use its function pointer, we can eliminate the
3122      address load.  */
3123
3124   /* If the symbol is marked NOPV, we are being told the function never
3125      needs its procedure value.  */
3126   if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3127     return symval;
3128
3129   /* If the symbol is marked STD_GP, we are being told the function does
3130      a normal ldgp in the first two words.  */
3131   else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3132     ;
3133
3134   /* Otherwise, we may be able to identify a GP load in the first two
3135      words, which we can then skip.  */
3136   else
3137     {
3138       Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3139       bfd_vma ofs;
3140
3141       /* Load the relocations from the section that the target symbol is in.  */
3142       if (info->sec == info->tsec)
3143         {
3144           tsec_relocs = info->relocs;
3145           tsec_relend = info->relend;
3146           tsec_free = NULL;
3147         }
3148       else
3149         {
3150           tsec_relocs = (_bfd_elf_link_read_relocs
3151                          (info->abfd, info->tsec, NULL,
3152                          (Elf_Internal_Rela *) NULL,
3153                          info->link_info->keep_memory));
3154           if (tsec_relocs == NULL)
3155             return 0;
3156           tsec_relend = tsec_relocs + info->tsec->reloc_count;
3157           tsec_free = (elf_section_data (info->tsec)->relocs == tsec_relocs
3158                        ? NULL
3159                        : tsec_relocs);
3160         }
3161
3162       /* Recover the symbol's offset within the section.  */
3163       ofs = (symval - info->tsec->output_section->vma
3164              - info->tsec->output_offset);
3165
3166       /* Look for a GPDISP reloc.  */
3167       gpdisp = (elf64_alpha_find_reloc_at_ofs
3168                 (tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3169
3170       if (!gpdisp || gpdisp->r_addend != 4)
3171         {
3172           if (tsec_free)
3173             free (tsec_free);
3174           return 0;
3175         }
3176       if (tsec_free)
3177         free (tsec_free);
3178     }
3179
3180   /* We've now determined that we can skip an initial gp load.  Verify
3181      that the call and the target use the same gp.   */
3182   if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3183       || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3184     return 0;
3185
3186   return symval + 8;
3187 }
3188
3189 static bfd_boolean
3190 elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3191                                bfd_vma symval, Elf_Internal_Rela *irel)
3192 {
3193   Elf_Internal_Rela *urel, *erel, *irelend = info->relend;
3194   int flags;
3195   bfd_signed_vma disp;
3196   bfd_boolean fits16;
3197   bfd_boolean fits32;
3198   bfd_boolean lit_reused = FALSE;
3199   bfd_boolean all_optimized = TRUE;
3200   bfd_boolean changed_contents;
3201   bfd_boolean changed_relocs;
3202   bfd_byte *contents = info->contents;
3203   bfd *abfd = info->abfd;
3204   bfd_vma sec_output_vma;
3205   unsigned int lit_insn;
3206   int relax_pass;
3207
3208   lit_insn = bfd_get_32 (abfd, contents + irel->r_offset);
3209   if (lit_insn >> 26 != OP_LDQ)
3210     {
3211       _bfd_error_handler
3212         /* xgettext:c-format */
3213         (_("%B: %A+%#Lx: warning: LITERAL relocation against unexpected insn"),
3214          abfd, info->sec, irel->r_offset);
3215       return TRUE;
3216     }
3217
3218   /* Can't relax dynamic symbols.  */
3219   if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3220     return TRUE;
3221
3222   changed_contents = info->changed_contents;
3223   changed_relocs = info->changed_relocs;
3224   sec_output_vma = info->sec->output_section->vma + info->sec->output_offset;
3225   relax_pass = info->link_info->relax_pass;
3226
3227   /* Summarize how this particular LITERAL is used.  */
3228   for (erel = irel+1, flags = 0; erel < irelend; ++erel)
3229     {
3230       if (ELF64_R_TYPE (erel->r_info) != R_ALPHA_LITUSE)
3231         break;
3232       if (erel->r_addend <= 6)
3233         flags |= 1 << erel->r_addend;
3234     }
3235
3236   /* A little preparation for the loop...  */
3237   disp = symval - info->gp;
3238
3239   for (urel = irel+1; urel < erel; ++urel)
3240     {
3241       bfd_vma urel_r_offset = urel->r_offset;
3242       unsigned int insn;
3243       int insn_disp;
3244       bfd_signed_vma xdisp;
3245       Elf_Internal_Rela nrel;
3246
3247       insn = bfd_get_32 (abfd, contents + urel_r_offset);
3248
3249       switch (urel->r_addend)
3250         {
3251         case LITUSE_ALPHA_ADDR:
3252         default:
3253           /* This type is really just a placeholder to note that all
3254              uses cannot be optimized, but to still allow some.  */
3255           all_optimized = FALSE;
3256           break;
3257
3258         case LITUSE_ALPHA_BASE:
3259           /* We may only create GPREL relocs during the second pass.  */
3260           if (relax_pass == 0)
3261             {
3262               all_optimized = FALSE;
3263               break;
3264             }
3265
3266           /* We can always optimize 16-bit displacements.  */
3267
3268           /* Extract the displacement from the instruction, sign-extending
3269              it if necessary, then test whether it is within 16 or 32 bits
3270              displacement from GP.  */
3271           insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3272
3273           xdisp = disp + insn_disp;
3274           fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3275           fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3276                     && xdisp < 0x7fff8000);
3277
3278           if (fits16)
3279             {
3280               /* Take the op code and dest from this insn, take the base
3281                  register from the literal insn.  Leave the offset alone.  */
3282               insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3283               bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3284               changed_contents = TRUE;
3285
3286               nrel = *urel;
3287               nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3288                                           R_ALPHA_GPREL16);
3289               nrel.r_addend = irel->r_addend;
3290
3291               /* As we adjust, move the reloc to the end so that we don't
3292                  break the LITERAL+LITUSE chain.  */
3293               if (urel < --erel)
3294                 *urel-- = *erel;
3295               *erel = nrel;
3296               changed_relocs = TRUE;
3297             }
3298
3299           /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3300           else if (fits32 && !(flags & ~6))
3301             {
3302               /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3303
3304               irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3305                                            R_ALPHA_GPRELHIGH);
3306               lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3307               bfd_put_32 (abfd, (bfd_vma) lit_insn, contents + irel->r_offset);
3308               lit_reused = TRUE;
3309               changed_contents = TRUE;
3310
3311               /* Since all relocs must be optimized, don't bother swapping
3312                  this relocation to the end.  */
3313               urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3314                                            R_ALPHA_GPRELLOW);
3315               urel->r_addend = irel->r_addend;
3316               changed_relocs = TRUE;
3317             }
3318           else
3319             all_optimized = FALSE;
3320           break;
3321
3322         case LITUSE_ALPHA_BYTOFF:
3323           /* We can always optimize byte instructions.  */
3324
3325           /* FIXME: sanity check the insn for byte op.  Check that the
3326              literal dest reg is indeed Rb in the byte insn.  */
3327
3328           insn &= ~ (unsigned) 0x001ff000;
3329           insn |= ((symval & 7) << 13) | 0x1000;
3330           bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3331           changed_contents = TRUE;
3332
3333           nrel = *urel;
3334           nrel.r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3335           nrel.r_addend = 0;
3336
3337           /* As we adjust, move the reloc to the end so that we don't
3338              break the LITERAL+LITUSE chain.  */
3339           if (urel < --erel)
3340             *urel-- = *erel;
3341           *erel = nrel;
3342           changed_relocs = TRUE;
3343           break;
3344
3345         case LITUSE_ALPHA_JSR:
3346         case LITUSE_ALPHA_TLSGD:
3347         case LITUSE_ALPHA_TLSLDM:
3348         case LITUSE_ALPHA_JSRDIRECT:
3349           {
3350             bfd_vma optdest, org;
3351             bfd_signed_vma odisp;
3352
3353             /* For undefined weak symbols, we're mostly interested in getting
3354                rid of the got entry whenever possible, so optimize this to a
3355                use of the zero register.  */
3356             if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3357               {
3358                 insn |= 31 << 16;
3359                 bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3360
3361                 changed_contents = TRUE;
3362                 break;
3363               }
3364
3365             /* If not zero, place to jump without needing pv.  */
3366             optdest = elf64_alpha_relax_opt_call (info, symval);
3367             org = sec_output_vma + urel_r_offset + 4;
3368             odisp = (optdest ? optdest : symval) - org;
3369
3370             if (odisp >= -0x400000 && odisp < 0x400000)
3371               {
3372                 Elf_Internal_Rela *xrel;
3373
3374                 /* Preserve branch prediction call stack when possible.  */
3375                 if ((insn & INSN_JSR_MASK) == INSN_JSR)
3376                   insn = (OP_BSR << 26) | (insn & 0x03e00000);
3377                 else
3378                   insn = (OP_BR << 26) | (insn & 0x03e00000);
3379                 bfd_put_32 (abfd, (bfd_vma) insn, contents + urel_r_offset);
3380                 changed_contents = TRUE;
3381
3382                 nrel = *urel;
3383                 nrel.r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3384                                             R_ALPHA_BRADDR);
3385                 nrel.r_addend = irel->r_addend;
3386
3387                 if (optdest)
3388                   nrel.r_addend += optdest - symval;
3389                 else
3390                   all_optimized = FALSE;
3391
3392                 /* Kill any HINT reloc that might exist for this insn.  */
3393                 xrel = (elf64_alpha_find_reloc_at_ofs
3394                         (info->relocs, info->relend, urel_r_offset,
3395                          R_ALPHA_HINT));
3396                 if (xrel)
3397                   xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3398
3399                 /* As we adjust, move the reloc to the end so that we don't
3400                    break the LITERAL+LITUSE chain.  */
3401                 if (urel < --erel)
3402                   *urel-- = *erel;
3403                 *erel = nrel;
3404
3405                 info->changed_relocs = TRUE;
3406               }
3407             else
3408               all_optimized = FALSE;
3409
3410             /* Even if the target is not in range for a direct branch,
3411                if we share a GP, we can eliminate the gp reload.  */
3412             if (optdest)
3413               {
3414                 Elf_Internal_Rela *gpdisp
3415                   = (elf64_alpha_find_reloc_at_ofs
3416                      (info->relocs, irelend, urel_r_offset + 4,
3417                       R_ALPHA_GPDISP));
3418                 if (gpdisp)
3419                   {
3420                     bfd_byte *p_ldah = contents + gpdisp->r_offset;
3421                     bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3422                     unsigned int ldah = bfd_get_32 (abfd, p_ldah);
3423                     unsigned int lda = bfd_get_32 (abfd, p_lda);
3424
3425                     /* Verify that the instruction is "ldah $29,0($26)".
3426                        Consider a function that ends in a noreturn call,
3427                        and that the next function begins with an ldgp,
3428                        and that by accident there is no padding between.
3429                        In that case the insn would use $27 as the base.  */
3430                     if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3431                       {
3432                         bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_ldah);
3433                         bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, p_lda);
3434
3435                         gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3436                         changed_contents = TRUE;
3437                         changed_relocs = TRUE;
3438                       }
3439                   }
3440               }
3441           }
3442           break;
3443         }
3444     }
3445
3446   /* If we reused the literal instruction, we must have optimized all.  */
3447   BFD_ASSERT(!lit_reused || all_optimized);
3448
3449   /* If all cases were optimized, we can reduce the use count on this
3450      got entry by one, possibly eliminating it.  */
3451   if (all_optimized)
3452     {
3453       if (--info->gotent->use_count == 0)
3454         {
3455           int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3456           alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3457           if (!info->h)
3458             alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3459         }
3460
3461       /* If the literal instruction is no longer needed (it may have been
3462          reused.  We can eliminate it.  */
3463       /* ??? For now, I don't want to deal with compacting the section,
3464          so just nop it out.  */
3465       if (!lit_reused)
3466         {
3467           irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3468           changed_relocs = TRUE;
3469
3470           bfd_put_32 (abfd, (bfd_vma) INSN_UNOP, contents + irel->r_offset);
3471           changed_contents = TRUE;
3472         }
3473     }
3474
3475   info->changed_contents = changed_contents;
3476   info->changed_relocs = changed_relocs;
3477
3478   if (all_optimized || relax_pass == 0)
3479     return TRUE;
3480   return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3481 }
3482
3483 static bfd_boolean
3484 elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3485                                 Elf_Internal_Rela *irel, bfd_boolean is_gd)
3486 {
3487   bfd_byte *pos[5];
3488   unsigned int insn, tlsgd_reg;
3489   Elf_Internal_Rela *gpdisp, *hint;
3490   bfd_boolean dynamic, use_gottprel;
3491   unsigned long new_symndx;
3492
3493   dynamic = alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info);
3494
3495   /* If a TLS symbol is accessed using IE at least once, there is no point
3496      to use dynamic model for it.  */
3497   if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3498     ;
3499
3500   /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3501      then we might as well relax to IE.  */
3502   else if (bfd_link_pic (info->link_info) && !dynamic
3503            && (info->link_info->flags & DF_STATIC_TLS))
3504     ;
3505
3506   /* Otherwise we must be building an executable to do anything.  */
3507   else if (bfd_link_pic (info->link_info))
3508     return TRUE;
3509
3510   /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3511      the matching LITUSE_TLS relocations.  */
3512   if (irel + 2 >= info->relend)
3513     return TRUE;
3514   if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3515       || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3516       || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3517     return TRUE;
3518
3519   /* There must be a GPDISP relocation positioned immediately after the
3520      LITUSE relocation.  */
3521   gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3522                                           irel[2].r_offset + 4, R_ALPHA_GPDISP);
3523   if (!gpdisp)
3524     return TRUE;
3525
3526   pos[0] = info->contents + irel[0].r_offset;
3527   pos[1] = info->contents + irel[1].r_offset;
3528   pos[2] = info->contents + irel[2].r_offset;
3529   pos[3] = info->contents + gpdisp->r_offset;
3530   pos[4] = pos[3] + gpdisp->r_addend;
3531
3532   /* Beware of the compiler hoisting part of the sequence out a loop
3533      and adjusting the destination register for the TLSGD insn.  If this
3534      happens, there will be a move into $16 before the JSR insn, so only
3535      transformations of the first insn pair should use this register.  */
3536   tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3537   tlsgd_reg = (tlsgd_reg >> 21) & 31;
3538
3539   /* Generally, the positions are not allowed to be out of order, lest the
3540      modified insn sequence have different register lifetimes.  We can make
3541      an exception when pos 1 is adjacent to pos 0.  */
3542   if (pos[1] + 4 == pos[0])
3543     {
3544       bfd_byte *tmp = pos[0];
3545       pos[0] = pos[1];
3546       pos[1] = tmp;
3547     }
3548   if (pos[1] >= pos[2] || pos[2] >= pos[3])
3549     return TRUE;
3550
3551   /* Reduce the use count on the LITERAL relocation.  Do this before we
3552      smash the symndx when we adjust the relocations below.  */
3553   {
3554     struct alpha_elf_got_entry *lit_gotent;
3555     struct alpha_elf_link_hash_entry *lit_h;
3556     unsigned long indx;
3557
3558     BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3559     indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3560     lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3561
3562     while (lit_h->root.root.type == bfd_link_hash_indirect
3563            || lit_h->root.root.type == bfd_link_hash_warning)
3564       lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3565
3566     for (lit_gotent = lit_h->got_entries; lit_gotent ;
3567          lit_gotent = lit_gotent->next)
3568       if (lit_gotent->gotobj == info->gotobj
3569           && lit_gotent->reloc_type == R_ALPHA_LITERAL
3570           && lit_gotent->addend == irel[1].r_addend)
3571         break;
3572     BFD_ASSERT (lit_gotent);
3573
3574     if (--lit_gotent->use_count == 0)
3575       {
3576         int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3577         alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3578       }
3579   }
3580
3581   /* Change
3582
3583         lda     $16,x($gp)                      !tlsgd!1
3584         ldq     $27,__tls_get_addr($gp)         !literal!1
3585         jsr     $26,($27),__tls_get_addr        !lituse_tlsgd!1
3586         ldah    $29,0($26)                      !gpdisp!2
3587         lda     $29,0($29)                      !gpdisp!2
3588      to
3589         ldq     $16,x($gp)                      !gottprel
3590         unop
3591         call_pal rduniq
3592         addq    $16,$0,$0
3593         unop
3594      or the first pair to
3595         lda     $16,x($gp)                      !tprel
3596         unop
3597      or
3598         ldah    $16,x($gp)                      !tprelhi
3599         lda     $16,x($16)                      !tprello
3600
3601      as appropriate.  */
3602
3603   use_gottprel = FALSE;
3604   new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3605
3606   /* Some compilers warn about a Boolean-looking expression being
3607      used in a switch.  The explicit cast silences them.  */
3608   switch ((int) (!dynamic && !bfd_link_pic (info->link_info)))
3609     {
3610     case 1:
3611       {
3612         bfd_vma tp_base;
3613         bfd_signed_vma disp;
3614
3615         BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3616         tp_base = alpha_get_tprel_base (info->link_info);
3617         disp = symval - tp_base;
3618
3619         if (disp >= -0x8000 && disp < 0x8000)
3620           {
3621             insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3622             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3623             bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3624
3625             irel[0].r_offset = pos[0] - info->contents;
3626             irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3627             irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3628             break;
3629           }
3630         else if (disp >= -(bfd_signed_vma) 0x80000000
3631                  && disp < (bfd_signed_vma) 0x7fff8000
3632                  && pos[0] + 4 == pos[1])
3633           {
3634             insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3635             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3636             insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3637             bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3638
3639             irel[0].r_offset = pos[0] - info->contents;
3640             irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3641             irel[1].r_offset = pos[1] - info->contents;
3642             irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3643             break;
3644           }
3645       }
3646       /* FALLTHRU */
3647
3648     default:
3649       use_gottprel = TRUE;
3650
3651       insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3652       bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3653       bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3654
3655       irel[0].r_offset = pos[0] - info->contents;
3656       irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3657       irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3658       break;
3659     }
3660
3661   bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3662
3663   insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3664   bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3665
3666   bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3667
3668   irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3669   gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3670
3671   hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3672                                         irel[2].r_offset, R_ALPHA_HINT);
3673   if (hint)
3674     hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3675
3676   info->changed_contents = TRUE;
3677   info->changed_relocs = TRUE;
3678
3679   /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3680   if (--info->gotent->use_count == 0)
3681     {
3682       int sz = alpha_got_entry_size (info->gotent->reloc_type);
3683       alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3684       if (!info->h)
3685         alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3686     }
3687
3688   /* If we've switched to a GOTTPREL relocation, increment the reference
3689      count on that got entry.  */
3690   if (use_gottprel)
3691     {
3692       struct alpha_elf_got_entry *tprel_gotent;
3693
3694       for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3695            tprel_gotent = tprel_gotent->next)
3696         if (tprel_gotent->gotobj == info->gotobj
3697             && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3698             && tprel_gotent->addend == irel->r_addend)
3699           break;
3700       if (tprel_gotent)
3701         tprel_gotent->use_count++;
3702       else
3703         {
3704           if (info->gotent->use_count == 0)
3705             tprel_gotent = info->gotent;
3706           else
3707             {
3708               tprel_gotent = (struct alpha_elf_got_entry *)
3709                 bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3710               if (!tprel_gotent)
3711                 return FALSE;
3712
3713               tprel_gotent->next = *info->first_gotent;
3714               *info->first_gotent = tprel_gotent;
3715
3716               tprel_gotent->gotobj = info->gotobj;
3717               tprel_gotent->addend = irel->r_addend;
3718               tprel_gotent->got_offset = -1;
3719               tprel_gotent->reloc_done = 0;
3720               tprel_gotent->reloc_xlated = 0;
3721             }
3722
3723           tprel_gotent->use_count = 1;
3724           tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3725         }
3726     }
3727
3728   return TRUE;
3729 }
3730
3731 static bfd_boolean
3732 elf64_alpha_relax_section (bfd *abfd, asection *sec,
3733                            struct bfd_link_info *link_info, bfd_boolean *again)
3734 {
3735   Elf_Internal_Shdr *symtab_hdr;
3736   Elf_Internal_Rela *internal_relocs;
3737   Elf_Internal_Rela *irel, *irelend;
3738   Elf_Internal_Sym *isymbuf = NULL;
3739   struct alpha_elf_got_entry **local_got_entries;
3740   struct alpha_relax_info info;
3741   struct alpha_elf_link_hash_table * htab;
3742   int relax_pass;
3743
3744   htab = alpha_elf_hash_table (link_info);
3745   if (htab == NULL)
3746     return FALSE;
3747
3748   /* There's nothing to change, yet.  */
3749   *again = FALSE;
3750
3751   if (bfd_link_relocatable (link_info)
3752       || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3753           != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3754       || sec->reloc_count == 0)
3755     return TRUE;
3756
3757   BFD_ASSERT (is_alpha_elf (abfd));
3758   relax_pass = link_info->relax_pass;
3759
3760   /* Make sure our GOT and PLT tables are up-to-date.  */
3761   if (htab->relax_trip != link_info->relax_trip)
3762     {
3763       htab->relax_trip = link_info->relax_trip;
3764
3765       /* This should never fail after the initial round, since the only error
3766          is GOT overflow, and relaxation only shrinks the table.  However, we
3767          may only merge got sections during the first pass.  If we merge
3768          sections after we've created GPREL relocs, the GP for the merged
3769          section backs up which may put the relocs out of range.  */
3770       if (!elf64_alpha_size_got_sections (link_info, relax_pass == 0))
3771         abort ();
3772       if (elf_hash_table (link_info)->dynamic_sections_created)
3773         {
3774           elf64_alpha_size_plt_section (link_info);
3775           elf64_alpha_size_rela_got_section (link_info);
3776         }
3777     }
3778
3779   symtab_hdr = &elf_symtab_hdr (abfd);
3780   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3781
3782   /* Load the relocations for this section.  */
3783   internal_relocs = (_bfd_elf_link_read_relocs
3784                      (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3785                       link_info->keep_memory));
3786   if (internal_relocs == NULL)
3787     return FALSE;
3788
3789   memset(&info, 0, sizeof (info));
3790   info.abfd = abfd;
3791   info.sec = sec;
3792   info.link_info = link_info;
3793   info.symtab_hdr = symtab_hdr;
3794   info.relocs = internal_relocs;
3795   info.relend = irelend = internal_relocs + sec->reloc_count;
3796
3797   /* Find the GP for this object.  Do not store the result back via
3798      _bfd_set_gp_value, since this could change again before final.  */
3799   info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3800   if (info.gotobj)
3801     {
3802       asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3803       info.gp = (sgot->output_section->vma
3804                  + sgot->output_offset
3805                  + 0x8000);
3806     }
3807
3808   /* Get the section contents.  */
3809   if (elf_section_data (sec)->this_hdr.contents != NULL)
3810     info.contents = elf_section_data (sec)->this_hdr.contents;
3811   else
3812     {
3813       if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3814         goto error_return;
3815     }
3816
3817   for (irel = internal_relocs; irel < irelend; irel++)
3818     {
3819       bfd_vma symval;
3820       struct alpha_elf_got_entry *gotent;
3821       unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3822       unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3823
3824       /* Early exit for unhandled or unrelaxable relocations.  */
3825       if (r_type != R_ALPHA_LITERAL)
3826         {
3827           /* We complete everything except LITERAL in the first pass.  */
3828           if (relax_pass != 0)
3829             continue;
3830           if (r_type == R_ALPHA_TLSLDM)
3831             {
3832               /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3833                  reloc to the STN_UNDEF (0) symbol so that they all match.  */
3834               r_symndx = STN_UNDEF;
3835             }
3836           else if (r_type != R_ALPHA_GOTDTPREL
3837                    && r_type != R_ALPHA_GOTTPREL
3838                    && r_type != R_ALPHA_TLSGD)
3839             continue;
3840         }
3841
3842       /* Get the value of the symbol referred to by the reloc.  */
3843       if (r_symndx < symtab_hdr->sh_info)
3844         {
3845           /* A local symbol.  */
3846           Elf_Internal_Sym *isym;
3847
3848           /* Read this BFD's local symbols.  */
3849           if (isymbuf == NULL)
3850             {
3851               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3852               if (isymbuf == NULL)
3853                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3854                                                 symtab_hdr->sh_info, 0,
3855                                                 NULL, NULL, NULL);
3856               if (isymbuf == NULL)
3857                 goto error_return;
3858             }
3859
3860           isym = isymbuf + r_symndx;
3861
3862           /* Given the symbol for a TLSLDM reloc is ignored, this also
3863              means forcing the symbol value to the tp base.  */
3864           if (r_type == R_ALPHA_TLSLDM)
3865             {
3866               info.tsec = bfd_abs_section_ptr;
3867               symval = alpha_get_tprel_base (info.link_info);
3868             }
3869           else
3870             {
3871               symval = isym->st_value;
3872               if (isym->st_shndx == SHN_UNDEF)
3873                 continue;
3874               else if (isym->st_shndx == SHN_ABS)
3875                 info.tsec = bfd_abs_section_ptr;
3876               else if (isym->st_shndx == SHN_COMMON)
3877                 info.tsec = bfd_com_section_ptr;
3878               else
3879                 info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3880             }
3881
3882           info.h = NULL;
3883           info.other = isym->st_other;
3884           if (local_got_entries)
3885             info.first_gotent = &local_got_entries[r_symndx];
3886           else
3887             {
3888               info.first_gotent = &info.gotent;
3889               info.gotent = NULL;
3890             }
3891         }
3892       else
3893         {
3894           unsigned long indx;
3895           struct alpha_elf_link_hash_entry *h;
3896
3897           indx = r_symndx - symtab_hdr->sh_info;
3898           h = alpha_elf_sym_hashes (abfd)[indx];
3899           BFD_ASSERT (h != NULL);
3900
3901           while (h->root.root.type == bfd_link_hash_indirect
3902                  || h->root.root.type == bfd_link_hash_warning)
3903             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3904
3905           /* If the symbol is undefined, we can't do anything with it.  */
3906           if (h->root.root.type == bfd_link_hash_undefined)
3907             continue;
3908
3909           /* If the symbol isn't defined in the current module,
3910              again we can't do anything.  */
3911           if (h->root.root.type == bfd_link_hash_undefweak)
3912             {
3913               info.tsec = bfd_abs_section_ptr;
3914               symval = 0;
3915             }
3916           else if (!h->root.def_regular)
3917             {
3918               /* Except for TLSGD relocs, which can sometimes be
3919                  relaxed to GOTTPREL relocs.  */
3920               if (r_type != R_ALPHA_TLSGD)
3921                 continue;
3922               info.tsec = bfd_abs_section_ptr;
3923               symval = 0;
3924             }
3925           else
3926             {
3927               info.tsec = h->root.root.u.def.section;
3928               symval = h->root.root.u.def.value;
3929             }
3930
3931           info.h = h;
3932           info.other = h->root.other;
3933           info.first_gotent = &h->got_entries;
3934         }
3935
3936       /* Search for the got entry to be used by this relocation.  */
3937       for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3938         if (gotent->gotobj == info.gotobj
3939             && gotent->reloc_type == r_type
3940             && gotent->addend == irel->r_addend)
3941           break;
3942       info.gotent = gotent;
3943
3944       symval += info.tsec->output_section->vma + info.tsec->output_offset;
3945       symval += irel->r_addend;
3946
3947       switch (r_type)
3948         {
3949         case R_ALPHA_LITERAL:
3950           BFD_ASSERT(info.gotent != NULL);
3951
3952           /* If there exist LITUSE relocations immediately following, this
3953              opens up all sorts of interesting optimizations, because we
3954              now know every location that this address load is used.  */
3955           if (irel+1 < irelend
3956               && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3957             {
3958               if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3959                 goto error_return;
3960             }
3961           else
3962             {
3963               if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3964                 goto error_return;
3965             }
3966           break;
3967
3968         case R_ALPHA_GOTDTPREL:
3969         case R_ALPHA_GOTTPREL:
3970           BFD_ASSERT(info.gotent != NULL);
3971           if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3972             goto error_return;
3973           break;
3974
3975         case R_ALPHA_TLSGD:
3976         case R_ALPHA_TLSLDM:
3977           BFD_ASSERT(info.gotent != NULL);
3978           if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3979                                                r_type == R_ALPHA_TLSGD))
3980             goto error_return;
3981           break;
3982         }
3983     }
3984
3985   if (isymbuf != NULL
3986       && symtab_hdr->contents != (unsigned char *) isymbuf)
3987     {
3988       if (!link_info->keep_memory)
3989         free (isymbuf);
3990       else
3991         {
3992           /* Cache the symbols for elf_link_input_bfd.  */
3993           symtab_hdr->contents = (unsigned char *) isymbuf;
3994         }
3995     }
3996
3997   if (info.contents != NULL
3998       && elf_section_data (sec)->this_hdr.contents != info.contents)
3999     {
4000       if (!info.changed_contents && !link_info->keep_memory)
4001         free (info.contents);
4002       else
4003         {
4004           /* Cache the section contents for elf_link_input_bfd.  */
4005           elf_section_data (sec)->this_hdr.contents = info.contents;
4006         }
4007     }
4008
4009   if (elf_section_data (sec)->relocs != internal_relocs)
4010     {
4011       if (!info.changed_relocs)
4012         free (internal_relocs);
4013       else
4014         elf_section_data (sec)->relocs = internal_relocs;
4015     }
4016
4017   *again = info.changed_contents || info.changed_relocs;
4018
4019   return TRUE;
4020
4021  error_return:
4022   if (isymbuf != NULL
4023       && symtab_hdr->contents != (unsigned char *) isymbuf)
4024     free (isymbuf);
4025   if (info.contents != NULL
4026       && elf_section_data (sec)->this_hdr.contents != info.contents)
4027     free (info.contents);
4028   if (internal_relocs != NULL
4029       && elf_section_data (sec)->relocs != internal_relocs)
4030     free (internal_relocs);
4031   return FALSE;
4032 }
4033 \f
4034 /* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4035    into the next available slot in SREL.  */
4036
4037 static void
4038 elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4039                          asection *sec, asection *srel, bfd_vma offset,
4040                          long dynindx, long rtype, bfd_vma addend)
4041 {
4042   Elf_Internal_Rela outrel;
4043   bfd_byte *loc;
4044
4045   BFD_ASSERT (srel != NULL);
4046
4047   outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4048   outrel.r_addend = addend;
4049
4050   offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4051   if ((offset | 1) != (bfd_vma) -1)
4052     outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4053   else
4054     memset (&outrel, 0, sizeof (outrel));
4055
4056   loc = srel->contents;
4057   loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4058   bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4059   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4060 }
4061
4062 /* Relocate an Alpha ELF section for a relocatable link.
4063
4064    We don't have to change anything unless the reloc is against a section
4065    symbol, in which case we have to adjust according to where the section
4066    symbol winds up in the output section.  */
4067
4068 static bfd_boolean
4069 elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4070                                 struct bfd_link_info *info ATTRIBUTE_UNUSED,
4071                                 bfd *input_bfd, asection *input_section,
4072                                 bfd_byte *contents ATTRIBUTE_UNUSED,
4073                                 Elf_Internal_Rela *relocs,
4074                                 Elf_Internal_Sym *local_syms,
4075                                 asection **local_sections)
4076 {
4077   unsigned long symtab_hdr_sh_info;
4078   Elf_Internal_Rela *rel;
4079   Elf_Internal_Rela *relend;
4080   struct elf_link_hash_entry **sym_hashes;
4081   bfd_boolean ret_val = TRUE;
4082
4083   symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4084   sym_hashes = elf_sym_hashes (input_bfd);
4085
4086   relend = relocs + input_section->reloc_count;
4087   for (rel = relocs; rel < relend; rel++)
4088     {
4089       unsigned long r_symndx;
4090       Elf_Internal_Sym *sym;
4091       asection *sec;
4092       unsigned long r_type;
4093
4094       r_type = ELF64_R_TYPE (rel->r_info);
4095       if (r_type >= R_ALPHA_max)
4096         {
4097           _bfd_error_handler
4098             /* xgettext:c-format */
4099             (_("%B: unknown relocation type %d"),
4100              input_bfd, (int) r_type);
4101           bfd_set_error (bfd_error_bad_value);
4102           ret_val = FALSE;
4103           continue;
4104         }
4105
4106       /* The symbol associated with GPDISP and LITUSE is
4107          immaterial.  Only the addend is significant.  */
4108       if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4109         continue;
4110
4111       r_symndx = ELF64_R_SYM (rel->r_info);
4112       if (r_symndx < symtab_hdr_sh_info)
4113         {
4114           sym = local_syms + r_symndx;
4115           sec = local_sections[r_symndx];
4116         }
4117       else
4118         {
4119           struct elf_link_hash_entry *h;
4120
4121           h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4122
4123           while (h->root.type == bfd_link_hash_indirect
4124                  || h->root.type == bfd_link_hash_warning)
4125             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4126
4127           if (h->root.type != bfd_link_hash_defined
4128               && h->root.type != bfd_link_hash_defweak)
4129             continue;
4130
4131           sym = NULL;
4132           sec = h->root.u.def.section;
4133         }
4134
4135       if (sec != NULL && discarded_section (sec))
4136         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4137                                          rel, 1, relend,
4138                                          elf64_alpha_howto_table + r_type, 0,
4139                                          contents);
4140
4141       if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4142         rel->r_addend += sec->output_offset;
4143     }
4144
4145   return ret_val;
4146 }
4147
4148 /* Relocate an Alpha ELF section.  */
4149
4150 static bfd_boolean
4151 elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4152                               bfd *input_bfd, asection *input_section,
4153                               bfd_byte *contents, Elf_Internal_Rela *relocs,
4154                               Elf_Internal_Sym *local_syms,
4155                               asection **local_sections)
4156 {
4157   Elf_Internal_Shdr *symtab_hdr;
4158   Elf_Internal_Rela *rel;
4159   Elf_Internal_Rela *relend;
4160   asection *sgot, *srel, *srelgot;
4161   bfd *dynobj, *gotobj;
4162   bfd_vma gp, tp_base, dtp_base;
4163   struct alpha_elf_got_entry **local_got_entries;
4164   bfd_boolean ret_val;
4165
4166   BFD_ASSERT (is_alpha_elf (input_bfd));
4167
4168   /* Handle relocatable links with a smaller loop.  */
4169   if (bfd_link_relocatable (info))
4170     return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4171                                            input_section, contents, relocs,
4172                                            local_syms, local_sections);
4173
4174   /* This is a final link.  */
4175
4176   ret_val = TRUE;
4177
4178   symtab_hdr = &elf_symtab_hdr (input_bfd);
4179
4180   dynobj = elf_hash_table (info)->dynobj;
4181   srelgot = elf_hash_table (info)->srelgot;
4182
4183   if (input_section->flags & SEC_ALLOC)
4184     {
4185       const char *section_name;
4186       section_name = (bfd_elf_string_from_elf_section
4187                       (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4188                        _bfd_elf_single_rel_hdr (input_section)->sh_name));
4189       BFD_ASSERT(section_name != NULL);
4190       srel = bfd_get_linker_section (dynobj, section_name);
4191     }
4192   else
4193     srel = NULL;
4194
4195   /* Find the gp value for this input bfd.  */
4196   gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4197   if (gotobj)
4198     {
4199       sgot = alpha_elf_tdata (gotobj)->got;
4200       gp = _bfd_get_gp_value (gotobj);
4201       if (gp == 0)
4202         {
4203           gp = (sgot->output_section->vma
4204                 + sgot->output_offset
4205                 + 0x8000);
4206           _bfd_set_gp_value (gotobj, gp);
4207         }
4208     }
4209   else
4210     {
4211       sgot = NULL;
4212       gp = 0;
4213     }
4214
4215   local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4216
4217   if (elf_hash_table (info)->tls_sec != NULL)
4218     {
4219       dtp_base = alpha_get_dtprel_base (info);
4220       tp_base = alpha_get_tprel_base (info);
4221     }
4222   else
4223     dtp_base = tp_base = 0;
4224
4225   relend = relocs + input_section->reloc_count;
4226   for (rel = relocs; rel < relend; rel++)
4227     {
4228       struct alpha_elf_link_hash_entry *h = NULL;
4229       struct alpha_elf_got_entry *gotent;
4230       bfd_reloc_status_type r;
4231       reloc_howto_type *howto;
4232       unsigned long r_symndx;
4233       Elf_Internal_Sym *sym = NULL;
4234       asection *sec = NULL;
4235       bfd_vma value;
4236       bfd_vma addend;
4237       bfd_boolean dynamic_symbol_p;
4238       bfd_boolean unresolved_reloc = FALSE;
4239       bfd_boolean undef_weak_ref = FALSE;
4240       unsigned long r_type;
4241
4242       r_type = ELF64_R_TYPE(rel->r_info);
4243       if (r_type >= R_ALPHA_max)
4244         {
4245           _bfd_error_handler
4246             /* xgettext:c-format */
4247             (_("%B: unknown relocation type %d"),
4248              input_bfd, (int) r_type);
4249           bfd_set_error (bfd_error_bad_value);
4250           ret_val = FALSE;
4251           continue;
4252         }
4253
4254       howto = elf64_alpha_howto_table + r_type;
4255       r_symndx = ELF64_R_SYM(rel->r_info);
4256
4257       /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4258          reloc to the STN_UNDEF (0) symbol so that they all match.  */
4259       if (r_type == R_ALPHA_TLSLDM)
4260         r_symndx = STN_UNDEF;
4261
4262       if (r_symndx < symtab_hdr->sh_info)
4263         {
4264           asection *msec;
4265           sym = local_syms + r_symndx;
4266           sec = local_sections[r_symndx];
4267           msec = sec;
4268           value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4269
4270           /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4271              this is hackery from relax_section.  Force the value to
4272              be the tls module base.  */
4273           if (r_symndx == STN_UNDEF
4274               && (r_type == R_ALPHA_TLSLDM
4275                   || r_type == R_ALPHA_GOTTPREL
4276                   || r_type == R_ALPHA_TPREL64
4277                   || r_type == R_ALPHA_TPRELHI
4278                   || r_type == R_ALPHA_TPRELLO
4279                   || r_type == R_ALPHA_TPREL16))
4280             value = dtp_base;
4281
4282           if (local_got_entries)
4283             gotent = local_got_entries[r_symndx];
4284           else
4285             gotent = NULL;
4286
4287           /* Need to adjust local GOT entries' addends for SEC_MERGE
4288              unless it has been done already.  */
4289           if ((sec->flags & SEC_MERGE)
4290               && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4291               && sec->sec_info_type == SEC_INFO_TYPE_MERGE
4292               && gotent
4293               && !gotent->reloc_xlated)
4294             {
4295               struct alpha_elf_got_entry *ent;
4296
4297               for (ent = gotent; ent; ent = ent->next)
4298                 {
4299                   ent->reloc_xlated = 1;
4300                   if (ent->use_count == 0)
4301                     continue;
4302                   msec = sec;
4303                   ent->addend =
4304                     _bfd_merged_section_offset (output_bfd, &msec,
4305                                                 elf_section_data (sec)->
4306                                                   sec_info,
4307                                                 sym->st_value + ent->addend);
4308                   ent->addend -= sym->st_value;
4309                   ent->addend += msec->output_section->vma
4310                                  + msec->output_offset
4311                                  - sec->output_section->vma
4312                                  - sec->output_offset;
4313                 }
4314             }
4315
4316           dynamic_symbol_p = FALSE;
4317         }
4318       else
4319         {
4320           bfd_boolean warned, ignored;
4321           struct elf_link_hash_entry *hh;
4322           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4323
4324           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4325                                    r_symndx, symtab_hdr, sym_hashes,
4326                                    hh, sec, value,
4327                                    unresolved_reloc, warned, ignored);
4328
4329           if (warned)
4330             continue;
4331
4332           if (value == 0
4333               && ! unresolved_reloc
4334               && hh->root.type == bfd_link_hash_undefweak)
4335             undef_weak_ref = TRUE;
4336
4337           h = (struct alpha_elf_link_hash_entry *) hh;
4338           dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4339           gotent = h->got_entries;
4340         }
4341
4342       if (sec != NULL && discarded_section (sec))
4343         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4344                                          rel, 1, relend, howto, 0, contents);
4345
4346       addend = rel->r_addend;
4347       value += addend;
4348
4349       /* Search for the proper got entry.  */
4350       for (; gotent ; gotent = gotent->next)
4351         if (gotent->gotobj == gotobj
4352             && gotent->reloc_type == r_type
4353             && gotent->addend == addend)
4354           break;
4355
4356       switch (r_type)
4357         {
4358         case R_ALPHA_GPDISP:
4359           {
4360             bfd_byte *p_ldah, *p_lda;
4361
4362             BFD_ASSERT(gp != 0);
4363
4364             value = (input_section->output_section->vma
4365                      + input_section->output_offset
4366                      + rel->r_offset);
4367
4368             p_ldah = contents + rel->r_offset;
4369             p_lda = p_ldah + rel->r_addend;
4370
4371             r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4372                                              p_ldah, p_lda);
4373           }
4374           break;
4375
4376         case R_ALPHA_LITERAL:
4377           BFD_ASSERT(sgot != NULL);
4378           BFD_ASSERT(gp != 0);
4379           BFD_ASSERT(gotent != NULL);
4380           BFD_ASSERT(gotent->use_count >= 1);
4381
4382           if (!gotent->reloc_done)
4383             {
4384               gotent->reloc_done = 1;
4385
4386               bfd_put_64 (output_bfd, value,
4387                           sgot->contents + gotent->got_offset);
4388
4389               /* If the symbol has been forced local, output a
4390                  RELATIVE reloc, otherwise it will be handled in
4391                  finish_dynamic_symbol.  */
4392               if (bfd_link_pic (info)
4393                   && !dynamic_symbol_p
4394                   && !undef_weak_ref)
4395                 elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4396                                          gotent->got_offset, 0,
4397                                          R_ALPHA_RELATIVE, value);
4398             }
4399
4400           value = (sgot->output_section->vma
4401                    + sgot->output_offset
4402                    + gotent->got_offset);
4403           value -= gp;
4404           goto default_reloc;
4405
4406         case R_ALPHA_GPREL32:
4407         case R_ALPHA_GPREL16:
4408         case R_ALPHA_GPRELLOW:
4409           if (dynamic_symbol_p)
4410             {
4411               _bfd_error_handler
4412                 /* xgettext:c-format */
4413                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4414                  input_bfd, h->root.root.root.string);
4415               ret_val = FALSE;
4416             }
4417           BFD_ASSERT(gp != 0);
4418           value -= gp;
4419           goto default_reloc;
4420
4421         case R_ALPHA_GPRELHIGH:
4422           if (dynamic_symbol_p)
4423             {
4424               _bfd_error_handler
4425                 /* xgettext:c-format */
4426                 (_("%B: gp-relative relocation against dynamic symbol %s"),
4427                  input_bfd, h->root.root.root.string);
4428               ret_val = FALSE;
4429             }
4430           BFD_ASSERT(gp != 0);
4431           value -= gp;
4432           value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4433           goto default_reloc;
4434
4435         case R_ALPHA_HINT:
4436           /* A call to a dynamic symbol is definitely out of range of
4437              the 16-bit displacement.  Don't bother writing anything.  */
4438           if (dynamic_symbol_p)
4439             {
4440               r = bfd_reloc_ok;
4441               break;
4442             }
4443           /* The regular PC-relative stuff measures from the start of
4444              the instruction rather than the end.  */
4445           value -= 4;
4446           goto default_reloc;
4447
4448         case R_ALPHA_BRADDR:
4449           if (dynamic_symbol_p)
4450             {
4451               _bfd_error_handler
4452                 /* xgettext:c-format */
4453                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4454                  input_bfd, h->root.root.root.string);
4455               ret_val = FALSE;
4456             }
4457           /* The regular PC-relative stuff measures from the start of
4458              the instruction rather than the end.  */
4459           value -= 4;
4460           goto default_reloc;
4461
4462         case R_ALPHA_BRSGP:
4463           {
4464             int other;
4465             const char *name;
4466
4467             /* The regular PC-relative stuff measures from the start of
4468                the instruction rather than the end.  */
4469             value -= 4;
4470
4471             /* The source and destination gp must be the same.  Note that
4472                the source will always have an assigned gp, since we forced
4473                one in check_relocs, but that the destination may not, as
4474                it might not have had any relocations at all.  Also take
4475                care not to crash if H is an undefined symbol.  */
4476             if (h != NULL && sec != NULL
4477                 && alpha_elf_tdata (sec->owner)->gotobj
4478                 && gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4479               {
4480                 _bfd_error_handler
4481                   /* xgettext:c-format */
4482                   (_("%B: change in gp: BRSGP %s"),
4483                    input_bfd, h->root.root.root.string);
4484                 ret_val = FALSE;
4485               }
4486
4487             /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4488             if (h != NULL)
4489               other = h->root.other;
4490             else
4491               other = sym->st_other;
4492             switch (other & STO_ALPHA_STD_GPLOAD)
4493               {
4494               case STO_ALPHA_NOPV:
4495                 break;
4496               case STO_ALPHA_STD_GPLOAD:
4497                 value += 8;
4498                 break;
4499               default:
4500                 if (h != NULL)
4501                   name = h->root.root.root.string;
4502                 else
4503                   {
4504                     name = (bfd_elf_string_from_elf_section
4505                             (input_bfd, symtab_hdr->sh_link, sym->st_name));
4506                     if (name == NULL)
4507                       name = _("<unknown>");
4508                     else if (name[0] == 0)
4509                       name = bfd_section_name (input_bfd, sec);
4510                   }
4511                 _bfd_error_handler
4512                   /* xgettext:c-format */
4513                   (_("%B: !samegp reloc against symbol without .prologue: %s"),
4514                    input_bfd, name);
4515                 ret_val = FALSE;
4516                 break;
4517               }
4518
4519             goto default_reloc;
4520           }
4521
4522         case R_ALPHA_REFLONG:
4523         case R_ALPHA_REFQUAD:
4524         case R_ALPHA_DTPREL64:
4525         case R_ALPHA_TPREL64:
4526           {
4527             long dynindx, dyntype = r_type;
4528             bfd_vma dynaddend;
4529
4530             /* Careful here to remember RELATIVE relocations for global
4531                variables for symbolic shared objects.  */
4532
4533             if (dynamic_symbol_p)
4534               {
4535                 BFD_ASSERT(h->root.dynindx != -1);
4536                 dynindx = h->root.dynindx;
4537                 dynaddend = addend;
4538                 addend = 0, value = 0;
4539               }
4540             else if (r_type == R_ALPHA_DTPREL64)
4541               {
4542                 BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4543                 value -= dtp_base;
4544                 goto default_reloc;
4545               }
4546             else if (r_type == R_ALPHA_TPREL64)
4547               {
4548                 BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4549                 if (!bfd_link_dll (info))
4550                   {
4551                     value -= tp_base;
4552                     goto default_reloc;
4553                   }
4554                 dynindx = 0;
4555                 dynaddend = value - dtp_base;
4556               }
4557             else if (bfd_link_pic (info)
4558                      && r_symndx != STN_UNDEF
4559                      && (input_section->flags & SEC_ALLOC)
4560                      && !undef_weak_ref
4561                      && !(unresolved_reloc
4562                           && (_bfd_elf_section_offset (output_bfd, info,
4563                                                        input_section,
4564                                                        rel->r_offset)
4565                               == (bfd_vma) -1)))
4566               {
4567                 if (r_type == R_ALPHA_REFLONG)
4568                   {
4569                     _bfd_error_handler
4570                       /* xgettext:c-format */
4571                       (_("%B: unhandled dynamic relocation against %s"),
4572                        input_bfd,
4573                        h->root.root.root.string);
4574                     ret_val = FALSE;
4575                   }
4576                 dynindx = 0;
4577                 dyntype = R_ALPHA_RELATIVE;
4578                 dynaddend = value;
4579               }
4580             else
4581               goto default_reloc;
4582
4583             if (input_section->flags & SEC_ALLOC)
4584               elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4585                                        srel, rel->r_offset, dynindx,
4586                                        dyntype, dynaddend);
4587           }
4588           goto default_reloc;
4589
4590         case R_ALPHA_SREL16:
4591         case R_ALPHA_SREL32:
4592         case R_ALPHA_SREL64:
4593           if (dynamic_symbol_p)
4594             {
4595               _bfd_error_handler
4596                 /* xgettext:c-format */
4597                 (_("%B: pc-relative relocation against dynamic symbol %s"),
4598                  input_bfd, h->root.root.root.string);
4599               ret_val = FALSE;
4600             }
4601           else if (bfd_link_pic (info)
4602                    && undef_weak_ref)
4603             {
4604               _bfd_error_handler
4605                 /* xgettext:c-format */
4606                 (_("%B: pc-relative relocation against undefined weak symbol %s"),
4607                  input_bfd, h->root.root.root.string);
4608               ret_val = FALSE;
4609             }
4610
4611
4612           /* ??? .eh_frame references to discarded sections will be smashed
4613              to relocations against SHN_UNDEF.  The .eh_frame format allows
4614              NULL to be encoded as 0 in any format, so this works here.  */
4615           if (r_symndx == STN_UNDEF
4616               || (unresolved_reloc
4617                   && _bfd_elf_section_offset (output_bfd, info,
4618                                               input_section,
4619                                               rel->r_offset) == (bfd_vma) -1))
4620             howto = (elf64_alpha_howto_table
4621                      + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4622           goto default_reloc;
4623
4624         case R_ALPHA_TLSLDM:
4625           /* Ignore the symbol for the relocation.  The result is always
4626              the current module.  */
4627           dynamic_symbol_p = 0;
4628           /* FALLTHRU */
4629
4630         case R_ALPHA_TLSGD:
4631           if (!gotent->reloc_done)
4632             {
4633               gotent->reloc_done = 1;
4634
4635               /* Note that the module index for the main program is 1.  */
4636               bfd_put_64 (output_bfd,
4637                           !bfd_link_pic (info) && !dynamic_symbol_p,
4638                           sgot->contents + gotent->got_offset);
4639
4640               /* If the symbol has been forced local, output a
4641                  DTPMOD64 reloc, otherwise it will be handled in
4642                  finish_dynamic_symbol.  */
4643               if (bfd_link_pic (info) && !dynamic_symbol_p)
4644                 elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4645                                          gotent->got_offset, 0,
4646                                          R_ALPHA_DTPMOD64, 0);
4647
4648               if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4649                 value = 0;
4650               else
4651                 {
4652                   BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4653                   value -= dtp_base;
4654                 }
4655               bfd_put_64 (output_bfd, value,
4656                           sgot->contents + gotent->got_offset + 8);
4657             }
4658
4659           value = (sgot->output_section->vma
4660                    + sgot->output_offset
4661                    + gotent->got_offset);
4662           value -= gp;
4663           goto default_reloc;
4664
4665         case R_ALPHA_DTPRELHI:
4666         case R_ALPHA_DTPRELLO:
4667         case R_ALPHA_DTPREL16:
4668           if (dynamic_symbol_p)
4669             {
4670               _bfd_error_handler
4671                 /* xgettext:c-format */
4672                 (_("%B: dtp-relative relocation against dynamic symbol %s"),
4673                  input_bfd, h->root.root.root.string);
4674               ret_val = FALSE;
4675             }
4676           BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4677           value -= dtp_base;
4678           if (r_type == R_ALPHA_DTPRELHI)
4679             value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4680           goto default_reloc;
4681
4682         case R_ALPHA_TPRELHI:
4683         case R_ALPHA_TPRELLO:
4684         case R_ALPHA_TPREL16:
4685           if (bfd_link_dll (info))
4686             {
4687               _bfd_error_handler
4688                 /* xgettext:c-format */
4689                 (_("%B: TLS local exec code cannot be linked into shared objects"),
4690                 input_bfd);
4691               ret_val = FALSE;
4692             }
4693           else if (dynamic_symbol_p)
4694             {
4695               _bfd_error_handler
4696                 /* xgettext:c-format */
4697                 (_("%B: tp-relative relocation against dynamic symbol %s"),
4698                  input_bfd, h->root.root.root.string);
4699               ret_val = FALSE;
4700             }
4701           BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4702           value -= tp_base;
4703           if (r_type == R_ALPHA_TPRELHI)
4704             value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4705           goto default_reloc;
4706
4707         case R_ALPHA_GOTDTPREL:
4708         case R_ALPHA_GOTTPREL:
4709           BFD_ASSERT(sgot != NULL);
4710           BFD_ASSERT(gp != 0);
4711           BFD_ASSERT(gotent != NULL);
4712           BFD_ASSERT(gotent->use_count >= 1);
4713
4714           if (!gotent->reloc_done)
4715             {
4716               gotent->reloc_done = 1;
4717
4718               if (dynamic_symbol_p)
4719                 value = 0;
4720               else
4721                 {
4722                   BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4723                   if (r_type == R_ALPHA_GOTDTPREL)
4724                     value -= dtp_base;
4725                   else if (!bfd_link_pic (info))
4726                     value -= tp_base;
4727                   else
4728                     {
4729                       elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4730                                                gotent->got_offset, 0,
4731                                                R_ALPHA_TPREL64,
4732                                                value - dtp_base);
4733                       value = 0;
4734                     }
4735                 }
4736               bfd_put_64 (output_bfd, value,
4737                           sgot->contents + gotent->got_offset);
4738             }
4739
4740           value = (sgot->output_section->vma
4741                    + sgot->output_offset
4742                    + gotent->got_offset);
4743           value -= gp;
4744           goto default_reloc;
4745
4746         default:
4747         default_reloc:
4748           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4749                                         contents, rel->r_offset, value, 0);
4750           break;
4751         }
4752
4753       switch (r)
4754         {
4755         case bfd_reloc_ok:
4756           break;
4757
4758         case bfd_reloc_overflow:
4759           {
4760             const char *name;
4761
4762             /* Don't warn if the overflow is due to pc relative reloc
4763                against discarded section.  Section optimization code should
4764                handle it.  */
4765
4766             if (r_symndx < symtab_hdr->sh_info
4767                 && sec != NULL && howto->pc_relative
4768                 && discarded_section (sec))
4769               break;
4770
4771             if (h != NULL)
4772               name = NULL;
4773             else
4774               {
4775                 name = (bfd_elf_string_from_elf_section
4776                         (input_bfd, symtab_hdr->sh_link, sym->st_name));
4777                 if (name == NULL)
4778                   return FALSE;
4779                 if (*name == '\0')
4780                   name = bfd_section_name (input_bfd, sec);
4781               }
4782             (*info->callbacks->reloc_overflow)
4783               (info, (h ? &h->root.root : NULL), name, howto->name,
4784                (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4785           }
4786           break;
4787
4788         default:
4789         case bfd_reloc_outofrange:
4790           abort ();
4791         }
4792     }
4793
4794   return ret_val;
4795 }
4796
4797 /* Finish up dynamic symbol handling.  We set the contents of various
4798    dynamic sections here.  */
4799
4800 static bfd_boolean
4801 elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4802                                    struct elf_link_hash_entry *h,
4803                                    Elf_Internal_Sym *sym)
4804 {
4805   struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4806
4807   if (h->needs_plt)
4808     {
4809       /* Fill in the .plt entry for this symbol.  */
4810       asection *splt, *sgot, *srel;
4811       Elf_Internal_Rela outrel;
4812       bfd_byte *loc;
4813       bfd_vma got_addr, plt_addr;
4814       bfd_vma plt_index;
4815       struct alpha_elf_got_entry *gotent;
4816
4817       BFD_ASSERT (h->dynindx != -1);
4818
4819       splt = elf_hash_table (info)->splt;
4820       BFD_ASSERT (splt != NULL);
4821       srel = elf_hash_table (info)->srelplt;
4822       BFD_ASSERT (srel != NULL);
4823
4824       for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4825         if (gotent->reloc_type == R_ALPHA_LITERAL
4826             && gotent->use_count > 0)
4827           {
4828             unsigned int insn;
4829             int disp;
4830
4831             sgot = alpha_elf_tdata (gotent->gotobj)->got;
4832             BFD_ASSERT (sgot != NULL);
4833
4834             BFD_ASSERT (gotent->got_offset != -1);
4835             BFD_ASSERT (gotent->plt_offset != -1);
4836
4837             got_addr = (sgot->output_section->vma
4838                         + sgot->output_offset
4839                         + gotent->got_offset);
4840             plt_addr = (splt->output_section->vma
4841                         + splt->output_offset
4842                         + gotent->plt_offset);
4843
4844             plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4845
4846             /* Fill in the entry in the procedure linkage table.  */
4847             if (elf64_alpha_use_secureplt)
4848               {
4849                 disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4850                 insn = INSN_AD (INSN_BR, 31, disp);
4851                 bfd_put_32 (output_bfd, insn,
4852                             splt->contents + gotent->plt_offset);
4853
4854                 plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4855                              / NEW_PLT_ENTRY_SIZE);
4856               }
4857             else
4858               {
4859                 disp = -(gotent->plt_offset + 4);
4860                 insn = INSN_AD (INSN_BR, 28, disp);
4861                 bfd_put_32 (output_bfd, insn,
4862                             splt->contents + gotent->plt_offset);
4863                 bfd_put_32 (output_bfd, INSN_UNOP,
4864                             splt->contents + gotent->plt_offset + 4);
4865                 bfd_put_32 (output_bfd, INSN_UNOP,
4866                             splt->contents + gotent->plt_offset + 8);
4867
4868                 plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4869                              / OLD_PLT_ENTRY_SIZE);
4870               }
4871
4872             /* Fill in the entry in the .rela.plt section.  */
4873             outrel.r_offset = got_addr;
4874             outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4875             outrel.r_addend = 0;
4876
4877             loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4878             bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4879
4880             /* Fill in the entry in the .got.  */
4881             bfd_put_64 (output_bfd, plt_addr,
4882                         sgot->contents + gotent->got_offset);
4883           }
4884     }
4885   else if (alpha_elf_dynamic_symbol_p (h, info))
4886     {
4887       /* Fill in the dynamic relocations for this symbol's .got entries.  */
4888       asection *srel;
4889       struct alpha_elf_got_entry *gotent;
4890
4891       srel = elf_hash_table (info)->srelgot;
4892       BFD_ASSERT (srel != NULL);
4893
4894       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4895            gotent != NULL;
4896            gotent = gotent->next)
4897         {
4898           asection *sgot;
4899           long r_type;
4900
4901           if (gotent->use_count == 0)
4902             continue;
4903
4904           sgot = alpha_elf_tdata (gotent->gotobj)->got;
4905
4906           r_type = gotent->reloc_type;
4907           switch (r_type)
4908             {
4909             case R_ALPHA_LITERAL:
4910               r_type = R_ALPHA_GLOB_DAT;
4911               break;
4912             case R_ALPHA_TLSGD:
4913               r_type = R_ALPHA_DTPMOD64;
4914               break;
4915             case R_ALPHA_GOTDTPREL:
4916               r_type = R_ALPHA_DTPREL64;
4917               break;
4918             case R_ALPHA_GOTTPREL:
4919               r_type = R_ALPHA_TPREL64;
4920               break;
4921             case R_ALPHA_TLSLDM:
4922             default:
4923               abort ();
4924             }
4925
4926           elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4927                                    gotent->got_offset, h->dynindx,
4928                                    r_type, gotent->addend);
4929
4930           if (gotent->reloc_type == R_ALPHA_TLSGD)
4931             elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4932                                      gotent->got_offset + 8, h->dynindx,
4933                                      R_ALPHA_DTPREL64, gotent->addend);
4934         }
4935     }
4936
4937   /* Mark some specially defined symbols as absolute.  */
4938   if (h == elf_hash_table (info)->hdynamic
4939       || h == elf_hash_table (info)->hgot
4940       || h == elf_hash_table (info)->hplt)
4941     sym->st_shndx = SHN_ABS;
4942
4943   return TRUE;
4944 }
4945
4946 /* Finish up the dynamic sections.  */
4947
4948 static bfd_boolean
4949 elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4950                                      struct bfd_link_info *info)
4951 {
4952   bfd *dynobj;
4953   asection *sdyn;
4954
4955   dynobj = elf_hash_table (info)->dynobj;
4956   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4957
4958   if (elf_hash_table (info)->dynamic_sections_created)
4959     {
4960       asection *splt, *sgotplt, *srelaplt;
4961       Elf64_External_Dyn *dyncon, *dynconend;
4962       bfd_vma plt_vma, gotplt_vma;
4963
4964       splt = elf_hash_table (info)->splt;
4965       srelaplt = elf_hash_table (info)->srelplt;
4966       BFD_ASSERT (splt != NULL && sdyn != NULL);
4967
4968       plt_vma = splt->output_section->vma + splt->output_offset;
4969
4970       gotplt_vma = 0;
4971       if (elf64_alpha_use_secureplt)
4972         {
4973           sgotplt = elf_hash_table (info)->sgotplt;
4974           BFD_ASSERT (sgotplt != NULL);
4975           if (sgotplt->size > 0)
4976             gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4977         }
4978
4979       dyncon = (Elf64_External_Dyn *) sdyn->contents;
4980       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4981       for (; dyncon < dynconend; dyncon++)
4982         {
4983           Elf_Internal_Dyn dyn;
4984
4985           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4986
4987           switch (dyn.d_tag)
4988             {
4989             case DT_PLTGOT:
4990               dyn.d_un.d_ptr
4991                 = elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4992               break;
4993             case DT_PLTRELSZ:
4994               dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
4995               break;
4996             case DT_JMPREL:
4997               dyn.d_un.d_ptr = srelaplt ? (srelaplt->output_section->vma
4998                                            + srelaplt->output_offset) : 0;
4999               break;
5000             }
5001
5002           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5003         }
5004
5005       /* Initialize the plt header.  */
5006       if (splt->size > 0)
5007         {
5008           unsigned int insn;
5009           int ofs;
5010
5011           if (elf64_alpha_use_secureplt)
5012             {
5013               ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
5014
5015               insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
5016               bfd_put_32 (output_bfd, insn, splt->contents);
5017
5018               insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
5019               bfd_put_32 (output_bfd, insn, splt->contents + 4);
5020
5021               insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
5022               bfd_put_32 (output_bfd, insn, splt->contents + 8);
5023
5024               insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
5025               bfd_put_32 (output_bfd, insn, splt->contents + 12);
5026
5027               insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
5028               bfd_put_32 (output_bfd, insn, splt->contents + 16);
5029
5030               insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
5031               bfd_put_32 (output_bfd, insn, splt->contents + 20);
5032
5033               insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
5034               bfd_put_32 (output_bfd, insn, splt->contents + 24);
5035
5036               insn = INSN_AB (INSN_JMP, 31, 27);
5037               bfd_put_32 (output_bfd, insn, splt->contents + 28);
5038
5039               insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
5040               bfd_put_32 (output_bfd, insn, splt->contents + 32);
5041             }
5042           else
5043             {
5044               insn = INSN_AD (INSN_BR, 27, 0);  /* br $27, .+4 */
5045               bfd_put_32 (output_bfd, insn, splt->contents);
5046
5047               insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5048               bfd_put_32 (output_bfd, insn, splt->contents + 4);
5049
5050               insn = INSN_UNOP;
5051               bfd_put_32 (output_bfd, insn, splt->contents + 8);
5052
5053               insn = INSN_AB (INSN_JMP, 27, 27);
5054               bfd_put_32 (output_bfd, insn, splt->contents + 12);
5055
5056               /* The next two words will be filled in by ld.so.  */
5057               bfd_put_64 (output_bfd, 0, splt->contents + 16);
5058               bfd_put_64 (output_bfd, 0, splt->contents + 24);
5059             }
5060
5061           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5062         }
5063     }
5064
5065   return TRUE;
5066 }
5067
5068 /* We need to use a special link routine to handle the .mdebug section.
5069    We need to merge all instances of these sections together, not write
5070    them all out sequentially.  */
5071
5072 static bfd_boolean
5073 elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5074 {
5075   asection *o;
5076   struct bfd_link_order *p;
5077   asection *mdebug_sec;
5078   struct ecoff_debug_info debug;
5079   const struct ecoff_debug_swap *swap
5080     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5081   HDRR *symhdr = &debug.symbolic_header;
5082   void * mdebug_handle = NULL;
5083   struct alpha_elf_link_hash_table * htab;
5084
5085   htab = alpha_elf_hash_table (info);
5086   if (htab == NULL)
5087     return FALSE;
5088
5089   /* Go through the sections and collect the mdebug information.  */
5090   mdebug_sec = NULL;
5091   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5092     {
5093       if (strcmp (o->name, ".mdebug") == 0)
5094         {
5095           struct extsym_info einfo;
5096
5097           /* We have found the .mdebug section in the output file.
5098              Look through all the link_orders comprising it and merge
5099              the information together.  */
5100           symhdr->magic = swap->sym_magic;
5101           /* FIXME: What should the version stamp be?  */
5102           symhdr->vstamp = 0;
5103           symhdr->ilineMax = 0;
5104           symhdr->cbLine = 0;
5105           symhdr->idnMax = 0;
5106           symhdr->ipdMax = 0;
5107           symhdr->isymMax = 0;
5108           symhdr->ioptMax = 0;
5109           symhdr->iauxMax = 0;
5110           symhdr->issMax = 0;
5111           symhdr->issExtMax = 0;
5112           symhdr->ifdMax = 0;
5113           symhdr->crfd = 0;
5114           symhdr->iextMax = 0;
5115
5116           /* We accumulate the debugging information itself in the
5117              debug_info structure.  */
5118           debug.line = NULL;
5119           debug.external_dnr = NULL;
5120           debug.external_pdr = NULL;
5121           debug.external_sym = NULL;
5122           debug.external_opt = NULL;
5123           debug.external_aux = NULL;
5124           debug.ss = NULL;
5125           debug.ssext = debug.ssext_end = NULL;
5126           debug.external_fdr = NULL;
5127           debug.external_rfd = NULL;
5128           debug.external_ext = debug.external_ext_end = NULL;
5129
5130           mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5131           if (mdebug_handle == NULL)
5132             return FALSE;
5133
5134           if (1)
5135             {
5136               asection *s;
5137               EXTR esym;
5138               bfd_vma last = 0;
5139               unsigned int i;
5140               static const char * const name[] =
5141                 {
5142                   ".text", ".init", ".fini", ".data",
5143                   ".rodata", ".sdata", ".sbss", ".bss"
5144                 };
5145               static const int sc[] = { scText, scInit, scFini, scData,
5146                                           scRData, scSData, scSBss, scBss };
5147
5148               esym.jmptbl = 0;
5149               esym.cobol_main = 0;
5150               esym.weakext = 0;
5151               esym.reserved = 0;
5152               esym.ifd = ifdNil;
5153               esym.asym.iss = issNil;
5154               esym.asym.st = stLocal;
5155               esym.asym.reserved = 0;
5156               esym.asym.index = indexNil;
5157               for (i = 0; i < 8; i++)
5158                 {
5159                   esym.asym.sc = sc[i];
5160                   s = bfd_get_section_by_name (abfd, name[i]);
5161                   if (s != NULL)
5162                     {
5163                       esym.asym.value = s->vma;
5164                       last = s->vma + s->size;
5165                     }
5166                   else
5167                     esym.asym.value = last;
5168
5169                   if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5170                                                       name[i], &esym))
5171                     return FALSE;
5172                 }
5173             }
5174
5175           for (p = o->map_head.link_order;
5176                p != (struct bfd_link_order *) NULL;
5177                p = p->next)
5178             {
5179               asection *input_section;
5180               bfd *input_bfd;
5181               const struct ecoff_debug_swap *input_swap;
5182               struct ecoff_debug_info input_debug;
5183               char *eraw_src;
5184               char *eraw_end;
5185
5186               if (p->type != bfd_indirect_link_order)
5187                 {
5188                   if (p->type == bfd_data_link_order)
5189                     continue;
5190                   abort ();
5191                 }
5192
5193               input_section = p->u.indirect.section;
5194               input_bfd = input_section->owner;
5195
5196               if (! is_alpha_elf (input_bfd))
5197                 /* I don't know what a non ALPHA ELF bfd would be
5198                    doing with a .mdebug section, but I don't really
5199                    want to deal with it.  */
5200                 continue;
5201
5202               input_swap = (get_elf_backend_data (input_bfd)
5203                             ->elf_backend_ecoff_debug_swap);
5204
5205               BFD_ASSERT (p->size == input_section->size);
5206
5207               /* The ECOFF linking code expects that we have already
5208                  read in the debugging information and set up an
5209                  ecoff_debug_info structure, so we do that now.  */
5210               if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5211                                                 &input_debug))
5212                 return FALSE;
5213
5214               if (! (bfd_ecoff_debug_accumulate
5215                      (mdebug_handle, abfd, &debug, swap, input_bfd,
5216                       &input_debug, input_swap, info)))
5217                 return FALSE;
5218
5219               /* Loop through the external symbols.  For each one with
5220                  interesting information, try to find the symbol in
5221                  the linker global hash table and save the information
5222                  for the output external symbols.  */
5223               eraw_src = (char *) input_debug.external_ext;
5224               eraw_end = (eraw_src
5225                           + (input_debug.symbolic_header.iextMax
5226                              * input_swap->external_ext_size));
5227               for (;
5228                    eraw_src < eraw_end;
5229                    eraw_src += input_swap->external_ext_size)
5230                 {
5231                   EXTR ext;
5232                   const char *name;
5233                   struct alpha_elf_link_hash_entry *h;
5234
5235                   (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
5236                   if (ext.asym.sc == scNil
5237                       || ext.asym.sc == scUndefined
5238                       || ext.asym.sc == scSUndefined)
5239                     continue;
5240
5241                   name = input_debug.ssext + ext.asym.iss;
5242                   h = alpha_elf_link_hash_lookup (htab, name, FALSE, FALSE, TRUE);
5243                   if (h == NULL || h->esym.ifd != -2)
5244                     continue;
5245
5246                   if (ext.ifd != -1)
5247                     {
5248                       BFD_ASSERT (ext.ifd
5249                                   < input_debug.symbolic_header.ifdMax);
5250                       ext.ifd = input_debug.ifdmap[ext.ifd];
5251                     }
5252
5253                   h->esym = ext;
5254                 }
5255
5256               /* Free up the information we just read.  */
5257               free (input_debug.line);
5258               free (input_debug.external_dnr);
5259               free (input_debug.external_pdr);
5260               free (input_debug.external_sym);
5261               free (input_debug.external_opt);
5262               free (input_debug.external_aux);
5263               free (input_debug.ss);
5264               free (input_debug.ssext);
5265               free (input_debug.external_fdr);
5266               free (input_debug.external_rfd);
5267               free (input_debug.external_ext);
5268
5269               /* Hack: reset the SEC_HAS_CONTENTS flag so that
5270                  elf_link_input_bfd ignores this section.  */
5271               input_section->flags &=~ SEC_HAS_CONTENTS;
5272             }
5273
5274           /* Build the external symbol information.  */
5275           einfo.abfd = abfd;
5276           einfo.info = info;
5277           einfo.debug = &debug;
5278           einfo.swap = swap;
5279           einfo.failed = FALSE;
5280           elf_link_hash_traverse (elf_hash_table (info),
5281                                   elf64_alpha_output_extsym,
5282                                   &einfo);
5283           if (einfo.failed)
5284             return FALSE;
5285
5286           /* Set the size of the .mdebug section.  */
5287           o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5288
5289           /* Skip this section later on (I don't think this currently
5290              matters, but someday it might).  */
5291           o->map_head.link_order = (struct bfd_link_order *) NULL;
5292
5293           mdebug_sec = o;
5294         }
5295     }
5296
5297   /* Invoke the regular ELF backend linker to do all the work.  */
5298   if (! bfd_elf_final_link (abfd, info))
5299     return FALSE;
5300
5301   /* Now write out the computed sections.  */
5302
5303   /* The .got subsections...  */
5304   {
5305     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5306     for (i = htab->got_list;
5307          i != NULL;
5308          i = alpha_elf_tdata(i)->got_link_next)
5309       {
5310         asection *sgot;
5311
5312         /* elf_bfd_final_link already did everything in dynobj.  */
5313         if (i == dynobj)
5314           continue;
5315
5316         sgot = alpha_elf_tdata(i)->got;
5317         if (! bfd_set_section_contents (abfd, sgot->output_section,
5318                                         sgot->contents,
5319                                         (file_ptr) sgot->output_offset,
5320                                         sgot->size))
5321           return FALSE;
5322       }
5323   }
5324
5325   if (mdebug_sec != (asection *) NULL)
5326     {
5327       BFD_ASSERT (abfd->output_has_begun);
5328       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5329                                                swap, info,
5330                                                mdebug_sec->filepos))
5331         return FALSE;
5332
5333       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5334     }
5335
5336   return TRUE;
5337 }
5338
5339 static enum elf_reloc_type_class
5340 elf64_alpha_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5341                               const asection *rel_sec ATTRIBUTE_UNUSED,
5342                               const Elf_Internal_Rela *rela)
5343 {
5344   switch ((int) ELF64_R_TYPE (rela->r_info))
5345     {
5346     case R_ALPHA_RELATIVE:
5347       return reloc_class_relative;
5348     case R_ALPHA_JMP_SLOT:
5349       return reloc_class_plt;
5350     case R_ALPHA_COPY:
5351       return reloc_class_copy;
5352     default:
5353       return reloc_class_normal;
5354     }
5355 }
5356 \f
5357 static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5358 {
5359   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5360   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5361   { NULL,                     0,  0, 0,            0 }
5362 };
5363
5364 /* ECOFF swapping routines.  These are used when dealing with the
5365    .mdebug section, which is in the ECOFF debugging format.  Copied
5366    from elf32-mips.c.  */
5367 static const struct ecoff_debug_swap
5368 elf64_alpha_ecoff_debug_swap =
5369 {
5370   /* Symbol table magic number.  */
5371   magicSym2,
5372   /* Alignment of debugging information.  E.g., 4.  */
5373   8,
5374   /* Sizes of external symbolic information.  */
5375   sizeof (struct hdr_ext),
5376   sizeof (struct dnr_ext),
5377   sizeof (struct pdr_ext),
5378   sizeof (struct sym_ext),
5379   sizeof (struct opt_ext),
5380   sizeof (struct fdr_ext),
5381   sizeof (struct rfd_ext),
5382   sizeof (struct ext_ext),
5383   /* Functions to swap in external symbolic data.  */
5384   ecoff_swap_hdr_in,
5385   ecoff_swap_dnr_in,
5386   ecoff_swap_pdr_in,
5387   ecoff_swap_sym_in,
5388   ecoff_swap_opt_in,
5389   ecoff_swap_fdr_in,
5390   ecoff_swap_rfd_in,
5391   ecoff_swap_ext_in,
5392   _bfd_ecoff_swap_tir_in,
5393   _bfd_ecoff_swap_rndx_in,
5394   /* Functions to swap out external symbolic data.  */
5395   ecoff_swap_hdr_out,
5396   ecoff_swap_dnr_out,
5397   ecoff_swap_pdr_out,
5398   ecoff_swap_sym_out,
5399   ecoff_swap_opt_out,
5400   ecoff_swap_fdr_out,
5401   ecoff_swap_rfd_out,
5402   ecoff_swap_ext_out,
5403   _bfd_ecoff_swap_tir_out,
5404   _bfd_ecoff_swap_rndx_out,
5405   /* Function to read in symbolic data.  */
5406   elf64_alpha_read_ecoff_info
5407 };
5408 \f
5409 /* Use a non-standard hash bucket size of 8.  */
5410
5411 static const struct elf_size_info alpha_elf_size_info =
5412 {
5413   sizeof (Elf64_External_Ehdr),
5414   sizeof (Elf64_External_Phdr),
5415   sizeof (Elf64_External_Shdr),
5416   sizeof (Elf64_External_Rel),
5417   sizeof (Elf64_External_Rela),
5418   sizeof (Elf64_External_Sym),
5419   sizeof (Elf64_External_Dyn),
5420   sizeof (Elf_External_Note),
5421   8,
5422   1,
5423   64, 3,
5424   ELFCLASS64, EV_CURRENT,
5425   bfd_elf64_write_out_phdrs,
5426   bfd_elf64_write_shdrs_and_ehdr,
5427   bfd_elf64_checksum_contents,
5428   bfd_elf64_write_relocs,
5429   bfd_elf64_swap_symbol_in,
5430   bfd_elf64_swap_symbol_out,
5431   bfd_elf64_slurp_reloc_table,
5432   bfd_elf64_slurp_symbol_table,
5433   bfd_elf64_swap_dyn_in,
5434   bfd_elf64_swap_dyn_out,
5435   bfd_elf64_swap_reloc_in,
5436   bfd_elf64_swap_reloc_out,
5437   bfd_elf64_swap_reloca_in,
5438   bfd_elf64_swap_reloca_out
5439 };
5440
5441 #define TARGET_LITTLE_SYM       alpha_elf64_vec
5442 #define TARGET_LITTLE_NAME      "elf64-alpha"
5443 #define ELF_ARCH                bfd_arch_alpha
5444 #define ELF_TARGET_ID           ALPHA_ELF_DATA
5445 #define ELF_MACHINE_CODE        EM_ALPHA
5446 #define ELF_MAXPAGESIZE 0x10000
5447 #define ELF_COMMONPAGESIZE      0x2000
5448
5449 #define bfd_elf64_bfd_link_hash_table_create \
5450   elf64_alpha_bfd_link_hash_table_create
5451
5452 #define bfd_elf64_bfd_reloc_type_lookup \
5453   elf64_alpha_bfd_reloc_type_lookup
5454 #define bfd_elf64_bfd_reloc_name_lookup \
5455   elf64_alpha_bfd_reloc_name_lookup
5456 #define elf_info_to_howto \
5457   elf64_alpha_info_to_howto
5458
5459 #define bfd_elf64_mkobject \
5460   elf64_alpha_mkobject
5461 #define elf_backend_object_p \
5462   elf64_alpha_object_p
5463
5464 #define elf_backend_section_from_shdr \
5465   elf64_alpha_section_from_shdr
5466 #define elf_backend_section_flags \
5467   elf64_alpha_section_flags
5468 #define elf_backend_fake_sections \
5469   elf64_alpha_fake_sections
5470
5471 #define bfd_elf64_bfd_is_local_label_name \
5472   elf64_alpha_is_local_label_name
5473 #define bfd_elf64_find_nearest_line \
5474   elf64_alpha_find_nearest_line
5475 #define bfd_elf64_bfd_relax_section \
5476   elf64_alpha_relax_section
5477
5478 #define elf_backend_add_symbol_hook \
5479   elf64_alpha_add_symbol_hook
5480 #define elf_backend_relocs_compatible \
5481   _bfd_elf_relocs_compatible
5482 #define elf_backend_sort_relocs_p \
5483   elf64_alpha_sort_relocs_p
5484 #define elf_backend_check_relocs \
5485   elf64_alpha_check_relocs
5486 #define elf_backend_create_dynamic_sections \
5487   elf64_alpha_create_dynamic_sections
5488 #define elf_backend_adjust_dynamic_symbol \
5489   elf64_alpha_adjust_dynamic_symbol
5490 #define elf_backend_merge_symbol_attribute \
5491   elf64_alpha_merge_symbol_attribute
5492 #define elf_backend_copy_indirect_symbol \
5493   elf64_alpha_copy_indirect_symbol
5494 #define elf_backend_always_size_sections \
5495   elf64_alpha_always_size_sections
5496 #define elf_backend_size_dynamic_sections \
5497   elf64_alpha_size_dynamic_sections
5498 #define elf_backend_omit_section_dynsym \
5499   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5500 #define elf_backend_relocate_section \
5501   elf64_alpha_relocate_section
5502 #define elf_backend_finish_dynamic_symbol \
5503   elf64_alpha_finish_dynamic_symbol
5504 #define elf_backend_finish_dynamic_sections \
5505   elf64_alpha_finish_dynamic_sections
5506 #define bfd_elf64_bfd_final_link \
5507   elf64_alpha_final_link
5508 #define elf_backend_reloc_type_class \
5509   elf64_alpha_reloc_type_class
5510
5511 #define elf_backend_can_gc_sections     1
5512 #define elf_backend_gc_mark_hook        elf64_alpha_gc_mark_hook
5513
5514 #define elf_backend_ecoff_debug_swap \
5515   &elf64_alpha_ecoff_debug_swap
5516
5517 #define elf_backend_size_info \
5518   alpha_elf_size_info
5519
5520 #define elf_backend_special_sections \
5521   elf64_alpha_special_sections
5522
5523 /* A few constants that determine how the .plt section is set up.  */
5524 #define elf_backend_want_got_plt 0
5525 #define elf_backend_plt_readonly 0
5526 #define elf_backend_want_plt_sym 1
5527 #define elf_backend_got_header_size 0
5528 #define elf_backend_dtrel_excludes_plt 1
5529
5530 #include "elf64-target.h"
5531 \f
5532 /* FreeBSD support.  */
5533
5534 #undef TARGET_LITTLE_SYM
5535 #define TARGET_LITTLE_SYM       alpha_elf64_fbsd_vec
5536 #undef TARGET_LITTLE_NAME
5537 #define TARGET_LITTLE_NAME      "elf64-alpha-freebsd"
5538 #undef  ELF_OSABI
5539 #define ELF_OSABI               ELFOSABI_FREEBSD
5540
5541 /* The kernel recognizes executables as valid only if they carry a
5542    "FreeBSD" label in the ELF header.  So we put this label on all
5543    executables and (for simplicity) also all other object files.  */
5544
5545 static void
5546 elf64_alpha_fbsd_post_process_headers (bfd * abfd,
5547         struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
5548 {
5549   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
5550
5551   i_ehdrp = elf_elfheader (abfd);
5552
5553   /* Put an ABI label supported by FreeBSD >= 4.1.  */
5554   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5555 #ifdef OLD_FREEBSD_ABI_LABEL
5556   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5557   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5558 #endif
5559 }
5560
5561 #undef elf_backend_post_process_headers
5562 #define elf_backend_post_process_headers \
5563   elf64_alpha_fbsd_post_process_headers
5564
5565 #undef  elf64_bed
5566 #define elf64_bed elf64_alpha_fbsd_bed
5567
5568 #include "elf64-target.h"