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