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