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