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