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